1.背景
序列化:将对象写入到IO流中, serialization
反序列化:从IO流中恢复对象, deserialization
2.实现
2.1 接口Serializable
java.io.Serializable
系统自动存储必要的信息
transient 关键字
@Transient 注解
2.2 接口Externalizable
java.io.Externalizable
程序员决定存储哪些信息
必须实现writeExternal和readExternal方法
类似:
public calss ExPerson implement Externalizable {
private String name;
private int age;
public ExPerson() {
}
public ExPerson(String name, int age){
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
StringBuffer reverse = new StringBuffer(name).reverse();
out.writeObject(reverse);
out.writeInt(age);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
this.name=((StringBuffer)in.readObject()).reverse().toString();
this.age=in.readInt();
}
}
2.3 序列化版本号
serialVersionUID, 保证兼容性
public class Person implements Serializable {
//序列化版本号
private static final long serialVersionUID = 11112222L;
private String name;
private int age;
}
反序列化class的版本号跟序列化中不一致,会抱InvalidClassException异常。
- 注意:序列化版本号可自由指定,如不指定,JVM会根据类信息自己计算一个版本号,随着class的升级,就无法正确反序列化。不指定序列化版本另一个明显隐患,不利于jvm间的移植,JVM的计算规则不一样。
2.4 普通序列化
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.txt"));
oss.writeObject(person);
2.4 普通反序列化
import java.io.FileInputStream;
import java.io.ObjectInputStream;
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.txt"));
Person person = (Person)ois.readObject();