基础知识学习
学习反序列化之前需要了解一些基础知识。
一、序列化和反序列化
Java 序列化是指把 Java 对象转换为字节序列的过程;Java 反序列化是指把字节序列恢复为 Java 对象的过程。对象序列化是对象持久化的一种实现方法,它是将对象的属性和方法转化为一种序列化的形式用于存储和传输。反序列化就是根据这些保存的信息重建对象的过程。
可以参考:https://xz.aliyun.com/t/6787
为了方便理解,我对在同一个默认包下,存在的User
类和Serialize_test_1
类的代码进行了注释:
User 类:
import java.io.Serializable;
public class User implements Serializable {
//定义类的私有属性name
private String name;
//定义setName方法
public void setName(String name) {
//当前类User的name等于setName传递进来的name
this.name = name;
}
//定义getName方法,返回name值
public String getName() {
return name;
}
}
Serialize_test_1 类:
:
import java.io.*;
public class Serialize_test_1 {
//序列化,返回值为字节类型,输入值为对象Object
public static byte[] serialize(final Object obj) throws Exception {
//创建字节数组输出流实例 btout,将所有发送到输出流的数据保存在该字节数组缓冲区中, 个人理解就是读数据并放入缓存区,读的数据以字节类型的数组保存在缓冲区
ByteArrayOutputStream btout = new ByteArrayOutputStream();
//创建objOut 对象输出流实例,也是类似以上的读数据,不过操作的是对象流,不是字节流,序列化对项的类,使其变得可以传输,操作
ObjectOutputStream objOut = new ObjectOutputStream(btout);
//调用对象输出为流的对象方法
objOut.writeObject(obj);
return btout.toByteArray();
}
//反序列化,返回值类型为对象类型,输入为字节类型
public static Object unserialize(final byte[] serialized) throws Exception {
ByteArrayInputStream btin = new ByteArrayInputStream(serialized);
ObjectInputStream objIn = new ObjectInputStream(btin);
return objIn.readObject();
}
public static void main(String[] args) throws Exception {
//实例化对象user,并设置其私有变量name值为posty
User user = new User();
user.setName("posty");
//序列化对象
byte[] serializeData = serialize(user);
//文件流,创建文件user.bin并写序列化后的数据
FileOutputStream fout = new FileOutputStream("user.bin");
fout.write(serializeData);
fout.close();
// (User)表示把反序列化后的对象转为User对象,并赋值给已经声明为User类的变量user2
User user2 = (User) unserialize(serializeData);
//调用User的getName方法
System.out.print(user2.getName());
}
}
二、Java 方法重写
在Java中,如果在⼦类中有和⽗类同名的⽅法,则通过⼦类实例去调⽤⽅法时,会调⽤ ⼦类的⽅法⽽不是⽗类的⽅法,这个特点称之为⽅法的重写(