在不提供 writeObject / readObject 方法的情况下实现可序列化

Moo*_*ooG 5 java serializable

如果一个类正在实现可序列化的接口,但writeObject/readObject代码库中的任何地方都没有方法实现怎么办?

默认方法是否defaultWriteObject/defaultReadObject会进行序列化?

是否只标记类implements Serializable足以序列化类?

如果是,那么什么正在被序列化,对象的状态在哪里被持久化?

Man*_*ngh 0

https://docs.oracle.com/javase/7/docs/api/java/io/Serializing.html

这也是一个很好的文档,可以参考以了解您所要求的要点,该文档的片段可能会帮助您更好地理解它。

writeObject 方法负责写入特定类的对象状态,以便相应的 readObject 方法可以恢复它。可以通过调用 out.defaultWriteObject 来调用保存对象字段的默认机制。该方法不需要关心属于其超类或子类的状态。通过使用 writeObject 方法将各个字段写入 ObjectOutputStream 或使用 DataOutput 支持的基本数据类型的方法来保存状态。

readObject 方法负责从流中读取并恢复类字段。它可以调用 in.defaultReadObject 来调用默认机制来恢复对象的非静态和非瞬态字段。defaultReadObject 方法使用流中的信息将流中保存的对象的字段分配给当前对象中相应命名的字段。这可以处理类已发展到添加新字段时的情况。该方法不需要关心属于其超类或子类的状态。通过使用 writeObject 方法将各个字段写入 ObjectOutputStream 或使用 DataOutput 支持的基本数据类型的方法来保存状态。

readObjectNoData 方法负责在序列化流未将给定类列为正在反序列化的对象的超类的情况下初始化其特定类的对象状态。如果接收方使用与发送方不同版本的反序列化实例类,并且接收方版本扩展了发送方版本未扩展的类,则可能会发生这种情况。如果序列化流被篡改,也可能会发生这种情况;因此,readObjectNoData 对于正确初始化反序列化对象非常有用,尽管源流是“敌对的”或不完整的。