对象的序列化

1、使用transient关键字修饰Filed虽然简单方便,但是被transient修饰的Filed完全被隔离在序列化机制之外,这样导致在反序列化恢复时无法取该Filed的值。

    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;

2、还有一种更彻底的自定义机制,他甚至可以在序列化对象时将该对象替换成其他对象,重写writeReplace()方法。

    这是因为在系统在序列化某个对象之前,会先调用该对象的writeReplace()和writeObject()方法,系统总是先调用被序列化的对象的writeReplace()方法,如果该对象方法返回另一个对象,系统将再次调用另一个对象的writeReplace()方法.......,直到该方法不再返回另一个对象为止,程序最后将调用该对象的writeObject()方法来保存该对象的状态。接下来调用readObject()方法,该方法的返回值会代替原来反序列化的对象,原来的readObject()反序列化的对象会被丢弃。

3、另一种自定义序列化机制

    这种序列化机制完全由程序员决定存储和恢复对象数据,但是强制必须实现Externalizable接口,实现readExternal(ObjectInput in)和writeExternal(ObjectOutput out)。

    这种实现机制虽然麻烦,但是相比实现Serializable接口性能略好。

你可能感兴趣的:(java,对象序列化)