我刚刚阅读了Serialization文档,并对此感到惊讶(强调我的):
writeObject
方法负责写入状态 对象为其特定的类使对应的readObject 方法可以恢复它。保存对象的默认机制 可以通过调用out.defaultWriteObject
来调用字段。 方法 不需要关注属于其的州 超类或子类。通过写个人来拯救国家 使用ObjectOutputStream
方法或{的writeObject
字段 使用DataOutput支持的原始数据类型的方法。
因此,在以下情况下,不能保证superclass
将被序列化:
public class MySuperClass implements Serializable{
public int a;
}
public class MySubClass extends MySuperClass{
public int b;
}
MySubClass msc = new MySubClass();
msc.a = 10
msc.b = 20
//serialize msc
那么,如果反序列化msc.a
的值为10
或0
,那么它的实现是否具体?
答案 0 :(得分:1)
此处,writeObject
和readObject
并未引用ObjectOutputStream
/ ObjectInputStream
的方法,而是指您可以选择在自己的班级中实施的方法,如果您需要与默认值不同的序列化行为。文档的这一部分说明了在实现这些方法时您需要关注与否。但由于您未在示例中使用此功能,因此这部分文档无关紧要。
答案 1 :(得分:1)
在段落上方的文档中,您摘录它说明在序列化和反序列化过程中需要特殊处理的类必须实现特殊方法。这些方法是@Beethoven提到的writeObject和readObject方法。
关于你询问msc.a值的问题,它定义为10.如果你的超类没有实现 Serializable 但子类确实如此,那么它将为0。即使您的超类没有实现 Serializable ,您也可以在noarg构造函数中为msc.a提供默认值。