保存Serializable对象时,引用的所有内容也必须是Serializable吗?

时间:2014-12-07 18:23:08

标签: java serialization

这可能是显而易见的,但我并没有完全了解序列化:

我有一个对象,它保存我的应用程序的状态。该对象引用了多个其他对象。

例如

ApplicationState implements Serializable
    private ArrayList<SomeApplicationObjects>
    private AnApplicationObject
    private AnotherObject

据我所知,所有这些对象(someApplicationObjects,anApplicationObject,anotherObject)都需要可序列化。

但是对象它们的引用也需要可序列化吗?例如,这里的SubObject是否也需要可序列化?这实际上是否意味着每个子对象都需要从ApplicationState向下递归地进行序列化?

AnotherObject implements Serializable
    private SubObject

3 个答案:

答案 0 :(得分:2)

  

这是否意味着每个子对象都需要可串行化,递归

假设子对象是您在类中使用的对象。是的,Searializable类型中使用的对象也是可序列化的。

在哪里

可序列化类的所有子类型本身都是可序列化的

答案 1 :(得分:1)

是的,正如接口serializable的javadoc中所报告的那样:

  

实现java.io.Serializable接口的类启用了类的可序列化。未实现此接口的类将不会将其任何状态序列化或反序列化。 可序列化类的所有子类型本身都是可序列化的。

因此,如果A必须是可序列化的,则A的子类型(例如B和C)也必须是可序列化的。所以B和C也应该有可序列化的子类型,等等......

答案 2 :(得分:0)

在java doc中提到序列化;

  

为了允许序列化非可序列化类的子类型,子类型可以承担保存和恢复超类型的公共,受保护和(如果可访问)包字段的状态的责任。只有当它扩展的类具有可访问的no-arg构造函数来初始化类的状态时,子类型才可以承担此责任。如果不是这种情况,则声明类Serializable是错误的。将在运行时检测到错误。

     

在反序列化期间,将使用类的public或protected no-arg构造函数初始化非可序列化类的字段。必须可以对可序列化的子类访问no-arg构造函数。可序列化子类的字段将从流中恢复。

     

遍历图形时,可能会遇到不支持Serializable接口的对象。在这种情况下,将抛出NotSerializableException,并将标识非可序列化对象的类。

所有子对象必须是可序列化的。