子类的Serilalization

时间:2016-09-08 15:32:46

标签: java serialization

我刚刚阅读了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的值为100,那么它的实现是否具体?

2 个答案:

答案 0 :(得分:1)

此处,writeObjectreadObject并未引用ObjectOutputStream / ObjectInputStream的方法,而是指您可以选择在自己的班级中实施的方法,如果您需要与默认值不同的序列化行为。文档的这一部分说明了在实现这些方法时您需要关注与否。但由于您未在示例中使用此功能,因此这部分文档无关紧要。

答案 1 :(得分:1)

在段落上方的文档中,您摘录它说明在序列化和反序列化过程中需要特殊处理的类必须实现特殊方法。这些方法是@Beethoven提到的writeObject和readObject方法。

关于你询问msc.a值的问题,它定义为10.如果你的超类没有实现 Serializable 但子类确实如此,那么它将为0。即使您的超类没有实现 Serializable ,您也可以在noarg构造函数中为msc.a提供默认值。