序列化是否会保存超类字段?
2022-09-03 17:45:53
我的子类实现了可序列化,但我的超类没有。
子类和超类都包含需要保存为子类状态的一部分的变量。
序列化是否会保存超类字段?
我的子类实现了可序列化,但我的超类没有。
子类和超类都包含需要保存为子类状态的一部分的变量。
序列化是否会保存超类字段?
如果超类字段不可序列化,则无法对其进行序列化。以下是 Java 序列化的一些规则的摘要:
对象是可序列化的(本身实现可序列化的接口),即使其超类不是。但是,可序列化类层次结构中的第一个超类(不实现可序列化接口)必须具有无 arg 构造函数。如果违反此规定,readObject() 将在运行时生成 java.io.InvalidClassException
。
每个不可序列化的超类的无参数构造函数将在反序列化对象时运行。但是,反序列化的对象呢?构造函数在反序列化时不运行。
该类必须在序列化时可见。
所有基元类型都是可序列化的。
瞬态字段(带有瞬态修饰符)不序列化(即,不保存或还原)。实现 Serializablemust 标记不支持序列化的类(例如,文件流)的瞬态字段的类。
静态字段(带静态修饰符)不序列化。
如果可序列化对象的成员变量引用不可序列化的对象,则代码将编译,但会引发 RumtimeException。
如果超类不是,则不会序列化字段。更重要的是,你需要在超类中有无参数构造函数。Serializable
正如文档所说:
在反序列化期间,不可序列化类的字段将使用类的公共或受保护的 no-arg 构造函数进行初始化。无 arg 构造函数必须可供可序列化的子类访问。