序列化是否会保存超类字段?

2022-09-03 17:45:53

我的子类实现了可序列化,但我的超类没有。

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

序列化是否会保存超类字段?


答案 1

如果超类字段不可序列化,则无法对其进行序列化。以下是 Java 序列化的一些规则的摘要:

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

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

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

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

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

  • 瞬态字段(带有瞬态修饰符)不序列化(即,不保存或还原)。实现 Serializablemust 标记不支持序列化的类(例如,文件流)的瞬态字段的类。

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

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


答案 2

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

正如文档所说:

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