一、使用transient关键字修饰Filed虽然简单方便,可是被transient修饰的Filed彻底被隔离在序列化机制以外,这样致使在反序列化恢复时没法取该Filed的值。
java
Java提供了一种自定义序列化机制,经过这种自定义机制可让程序控制如何序列化各Filed.
程序员
在序列化和反序列化过程当中须要特出处理的类应该提供以下特殊方法:
性能
private void writeObject(java.io.ObjectOutputStream out) throws IOException; private void readObject(java.io.ObjectIntputStream out) throws IOException,ClassNotFoundException; private void readObjectNoData()throws ObjectStreamException;
二、还有一种更完全的自定义机制,他甚至能够在序列化对象时将该对象替换成其余对象,重写writeReplace()方法。spa
这是由于在系统在序列化某个对象以前,会先调用该对象的writeReplace()和writeObject()方法,系统老是先调用被序列化的对象的writeReplace()方法,若是该对象方法返回另外一个对象,系统将再次调用另外一个对象的writeReplace()方法.......,直到该方法再也不返回另外一个对象为止,程序最后将调用该对象的writeObject()方法来保存该对象的状态。接下来调用readObject()方法,该方法的返回值会代替原来反序列化的对象,原来的readObject()反序列化的对象会被丢弃。code
三、另外一种自定义序列化机制
对象
这种序列化机制彻底由程序员决定存储和恢复对象数据,可是强制必须实现Externalizable接口,实现readExternal(ObjectInput in)和writeExternal(ObjectOutput out)。接口
这种实现机制虽然麻烦,可是相比实现Serializable接口性能略好。
it