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

我的子类实现了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构造函数。