序列化会保存超类字段吗?

时间:2013-05-08 14:04:38

标签: java serialization

我的子类实现了Serializable,但我的超类没有。

子类和超类都包含需要保存为子类状态一部分的变量。

序列化会保存超类字段吗?

2 个答案:

答案 0 :(得分:24)

如果超类字段不是Serializable,则无法序列化。这是Java序列化的一些规则的摘要:

  • 仅当对象的类或其超类实现Serializable(或Externalizable)接口时,该对象才可序列化。

  • 对象是可序列化的(本身实现了Serializable接口),即使它的超类不是。但是,可序列化类的层次结构中的第一个类(不实现Serializable接口)必须具有无参数构造函数。如果违反了此规则,readObject()将在运行时生成java.io.InvalidClassException

  • 每个不可序列化的超类的no-arg构造函数将在反序列化对象时运行。但是,反序列化的对象?构造函数在反序列化时不会运行。

  • 该类必须在序列化时可见。

  • 所有基本类型都是可序列化的。

  • 瞬态字段(带有瞬态修饰符)未被序列化(即,未保存或恢复)。实现Serializable的类可以标记不支持序列化的类的传输字段(例如,文件流)。

  • 静态字段(带有静态修饰符)未序列化。

  • 如果可序列化对象的成员变量引用了非可序列化对象,则代码将被编译但抛出RumtimeException。

答案 1 :(得分:3)

如果超类不是Serializable字段,则不会序列化。你需要在超类中使用no-args构造函数。

正如文件所说:

  

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