序列化会保存超类字段吗?
我的子类实现了Serializable,但我的超类没有。
子类和超类都包含需要保存为子类状态的一部分的变量。
序列化会保存超类字段吗?
如果超类字段不是Serializable,则无法序列化。这是Java序列化的一些规则的摘要:
-
仅当对象的类或其超类实现
Serializable
(或Externalizable
)接口时,该对象才可Serializable
。 -
对象是可序列化的(本身实现了Serializable接口),即使它的超类不是。 但是,可序列化类的层次结构中的第一个类(不实现Serializable接口)必须具有无参数构造函数。 如果违反了此规则,readObject()将在运行时生成
java.io.InvalidClassException
。 -
每个不可序列化的超类的no-arg构造函数将在反序列化对象时运行。 但是,反序列化的对象? 构造函数在反序列化时不会运行。
-
该类必须在序列化时可见。
-
所有原始类型都是可序列化的。
-
瞬态字段(具有瞬态修饰符)未被序列化(即,未保存或恢复)。 实现Serializable的类可以标记不支持序列化的类的传输字段(例如,文件流)。
-
静态字段(带有静态修饰符)未序列化。
-
如果可序列化对象的成员变量引用不可序列化的对象,则代码将编译但抛出RumtimeException。
如果超类不是Serializable
字段将不会被序列化。 你需要在超类中使用no-args构造函数。
正如文件所说:
在反序列化期间,将使用类的public或protected no-arg构造函数初始化非可序列化类的字段。 必须可以对可序列化的子类访问no-arg构造函数。