Java 源码阅读:Serializable

应用场景

  1. 把内存中的对象保存到一个文件或数据库中
  2. 使用套接字在网络上传递对象

也就是持久化和RPC。

翻译

通过类实现Java.io.Serializable接口,类的序列化(Serializability)是可以使用的。不实现此接口的类不会有序列化或反序列化的状态。所有序列类的子类型是它们自身的序列化。序列化接口没有方法或变量,仅是提供了确认序列化接口的语义。

为了允许非序列化类的子类型能够序列化,子类型或许可以假设有保存、恢复子类型公共、受保护的字段状态的责任。子类型可以假设这个责任,只有类继承发访问没有参数的构造器去初始化类的状态。如果没有实例声明类的序列化是一个错误。在运行时这个错误会被探测到。

在反序列化期间,没有序列化的类的字段使用公共或受保护的类的无参数构造器进行初始化。无参数构造器对于可序列化的子类型一定得可以访问。可序列化的子类型变量将从这数据流中恢复。

当 traversing(遍历)一个图、对象可能遇到不支持序列化接口。在这种案例中,会抛出 NotSerializableException并且将确认该类为非序列化对象。

在序列化期间类需要特殊处理,并且反序列化进程必须实现这些特殊方法的签名:

private void writeObject(java.io.ObjectOutputStream out) throws IOExeption;
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;
private void readObjectNoData() throws ObjectStreamException;

writeObject 方法有责任对特定的类写入对象的状态,这样与之通信的 readObject 方法就可以恢复它。默认的保存对象变量的机制(mechanism)可以通过 defaultWriteObject 来调用。 这个方法不需要关系它自己是属于父类还是子类。使用 writeObject 方法或者 DataOutput 支持的原始方法可以把独立的变量写入 ObjectOutputSteam,这样状态就保存了。

readObject 方法有责任从数据流中读取和恢复类的变量。
......
用到的时候再看吧。。。。

你可能感兴趣的:(Java 源码阅读:Serializable)