java反序列化

折翼的小鸟先生 / 2024-04-30 / 原文

java反序列化

前言之前我们大致学习了php反序列化的内容,本节我们来了解一下java反序列化

1.1 java反序列化基础

1 功能特性:不像php反序列化中将对象转换为字符串,在java中,对象序列化后的结果是字节流。在java中反序

列化操作一般应用在导入模板文件,网络通信,数据传输,日志格式化存储等操作。

2 数据特性:一段数据要是以rO0AB 开头,那么基本可以确定这是java序列化base64加密的数据,如果是以aced

开头,那么他就是一段java序列化的16进制

3 反序列化判断:

可以通过查看java中是否引用Serializable接口来判断是否进行序列化,我们来查看一个序列化的具体例子:

import java.io.*;

class Name implements Serializable { // 实现Serializable接口
    private static final long serialVersionUID = 1L; // 添加serialVersionUID
    public String name;
    public int age;

    public Name(String name, int age) {
        this.age = age;
        this.name = name;
    }
}

public class Hello {
    public static void main(String[] args) {
        var man = new Name("jack", 20);

        try (ObjectOutputStream oos = new ObjectOutputStream(
                new FileOutputStream("D:\\java\\com.Hello\\Hello\\src\\person.txt"))) { // 使用try-with-resources自动关闭流
            oos.writeObject(man);
        } catch (IOException e) { // 处理IOException
            e.printStackTrace();
            System.out.println("An error occurred while writing to the file.");
        }
    }
}

需要注意的是,打开输出流操作需要做异常处理

oos.writeObject(man);将对象序列化后以字节码的形式存储在文件中

我们将写入数据后的文件用可以查看十六进制数据的软件打开,可以发现在十六进制数据的头部有着aced,这说

明这是一段java序列化后的16进制数据