1. 必须implements Serializable;
2. 基本算法是:
a. 写出当前类的meta data
b. 递归调用写出,直至java.lang.Object, 父类的meta data
c. 写出实例字段信息
3. 如果类中某个字段不能序列化,或者不需要序列化,将该字段标记为transistent。 除去transistent的其他字段, 包括private的,都会被序列化;
4. 对于已序列化的对象,增加/减少字段或者方法,反序列化会报错java.io.InvalidClassException;如果这样的变化是兼容的,那么可以提供一个字段serialVersionUID,给定确定的一个值;如果是类的层级改变了,那么也是不能反序列化的;
5. 对象序列化和反序列化,可通过调用ObjectInputStream.readObject()/ObjectOutputStream.writeObject
FileOutputStream fos = new FileOutputStream("temp.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
SerialTest st = new SerialTest();
oos.writeObject(st);
oos.flush();
oos.close();
FileInputStream fis = new FileInputStream("temp.out");
ObjectInputStream oin = new ObjectInputStream(fis);
TestSerial ts = (TestSerial) oin.readObject();
System.out.println("version="+ts.version);
6. 如果要对序列化做更多的控制,可以实现以下的方法:
private void writeObject(ObjectOutputStream out) throws IOException;
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;
参考:
1. https://www.javaworld.com/article/2072752/the-java-serialization-algorithm-revealed.html
2. http://www.oracle.com/technetwork/articles/java/javaserial-1536170.html