Java Serializable key points

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

猜你喜欢

转载自my.oschina.net/u/922297/blog/1803013
今日推荐