Serializable接口说明
类的可序列化性通过实现(implements) java.io.Serializable可序列化接口。 没有实现这个接口的类不会将其任何状态序列化或反序列化。 可序列化类的所有子类型本身可序列化。 序列化接口没有方法或字段只用于识别可序列化的语义。
为了允许序列化不可序列化类的子类型,子类型可以承担保存和还原父类型的公开状态(public),受保护状态(protected)和(如果可以访问)包字段。 只有在以下情况下,子类型才能承担此责任:扩展的类具有可访问的无参(no-arg)构造函数,用于初始化类的状态。 如果不是这种情况,声明出来的序列化类是错误的, 错误将会在运行时(runtime)被检测到。
在反序列化期间,不可序列化类的字段将使用公开的(public)或受保护的(protected)无参(no-arg)构造函数进行初始化。 子类必须可访问无参数构造函数那是可序列化的。 可序列化子类的字段将从流中恢复。
在遍历类字段时,可能会遇到一个对象,该对象不会支持序列化Serializable接口。 在这种情况下会抛出NotSerializableException并将识不可序列化的对象类名称。
类在序列化和反序列化过程必须执行具有这些确切要求的特殊方法签名:
1、private void writeObject(java.io.ObjectOutputStream out)throws IOException
2、private void readObject(java.io.ObjectInputStream in)throws IOException,ClassNotFoundException;
3、private void readObjectNoData( ) throws ObjectStreamException;
writeObject方法负责写入对象,以便readObject方法可以还原它。默认的保存机制可以通过调用来调用对象的字段out.defaultWriteObject。该方法不需要考虑它自身的状态属于它的超类(superclasses)或子类(subclasses)。通过使用writeObject方法或使用DATAOutput支持的原始数据类型将各个字段状态保存到ObjectOutputStream。
readObject方法负责从流中读取并恢复类类属性字段。它可以调用in.defaultReadObject来调用恢复对象的非静态(non-static)和非瞬态(non-transient)字段。defaultReadObject方法使用流中的信息将保存在流中的对象的字段与当前对象中相应命名的字段一起分配。当类添加新字段的时候,会发生这种情况。 该方法不需要关注属于其超类(superclasses)或子类(subclasses)的状态。通过使用writeObject方法或使用DATAOutput支持的原始数据类型将各个字段状态保存到ObjectOutputStream。
readObjectNoData方法负责在序列化流没有将给定类列为反序列化对象的超类的情况下初始化其特定类的对象状态。当接收方使用与发送方不同的反序列化实例类版本,并且接收方的版本扩展了发送方版本未扩展的