为什么基类(不实现Serializable)应该没有参数构造函数,如果它的子类实现Serializable?

Old*_*ool 8 java serialization

我正在阅读界面文档Serializable,其中我找到以下几行:

为了允许序列化非可序列化类的子类型,子类型可以承担保存和恢复超类型的公共,受保护和(如果可访问)包字段的状态的责任.只有当它扩展的类具有可访问的no-arg构造函数来初始化类的状态时,子类型才可以承担此责任.如果不是这种情况,则声明类Serializable是错误的.将在运行时检测到错误.

但是,基类的无参数构造函数在恢复对象状态方面的作用是什么?

Agi*_*Pro 14

当您尝试反序列化可序列化对象时,该机制必须创建该对象的空实例,并填写成员,以将对象还原到序列化时的状态.首次构造对象时,将调用可序列化对象的构造函数,但在反序列化期间不会调用构造函数,因为从技术上讲,您不构造对象,而是将其重构为前一个状态.预期构造和子序列操作的任何影响已经被合并到对象状态中.

每当你构造任何类的对象时,Java必须调用超类的构造函数,超级超类等.你可以通过使用super(...)或者如果你没有指定超类来指定超类的特定构造函数.构造函数,将使用默认构造函数.无论如何,构造了根的所有类.

对可serlializable对象进行反序列化不会导致构造函数调用,但是当存在一个不可序列化的超类时(即您使用可序列化的类扩展一个不可序列化的类),那么该类不期望被反序列化,并且它具有没有用于存储/恢​​复其成员的机制.如果超类不可序列化,则反序列化机制需要调用零参数构造函数以确保正确初始化重构的对象实例.

如果未能指定零参数构造函数,则在第一次尝试反序列化该类的对象之前,反序列化代码不会警告您此问题.编译时没有警告.

此外,您的可序列化子类必须负责存储/恢复来自非可序列化超类的任何成员值.