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

Dan*_*jel 12 java serialization

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

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

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

Jun*_*san 26

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

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

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

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

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

  • 所有原始类型都是可序列化的.

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

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

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

  • 如果你复制粘贴解决方案,请提供一个来源(对任何感兴趣的人:http://www.xyzws.com/Javafaq/what-are-rules-of-serialization-in-java/208) (6认同)

Mic*_*rek 5

如果超类不是Serializable字段,则不会序列化。更重要的是,您需要在超类中有无参数构造函数。

正如文档所说:

在反序列化期间,不可序列化类的字段将使用类的公共或受保护的无参数构造函数进行初始化。可序列化的子类必须可以访问无参数构造函数。