14

我的子类实现了 Serializable,但我的超类没有。

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

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

4

2 回答 2

28

一个超类的字段如果不是Serializable是不能被序列化的。这里总结一下Java序列化的一些规则:

  • 一个对象只有在其类或其超类实现Serializable(或 Externalizable)接口时才可序列化。

  • 一个对象是可序列化的(它本身实现了 Serializable 接口),即使它的超类不是。然而,可序列化类的层次结构中的第一个超类,没有实现可序列化接口,必须有一个无参数的构造函数。如果违反这一点, readObject() 将java.io.InvalidClassException在运行时产生 a。

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

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

  • 所有原始类型都是可序列化的。

  • 瞬态字段(带有瞬态修饰符)未序列化(即未保存或恢复)。实现 Serializable 的类必须标记不支持序列化的类的瞬态字段(例如,文件流)。

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

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

于 2013-05-08T14:11:59.970 回答
5

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

正如文件所说:

在反序列化过程中,不可序列化类的字段将使用类的公共或受保护的无参数构造函数进行初始化。可序列化的子类必须可以访问无参数构造函数。

于 2013-05-08T14:08:34.257 回答