readObject()与readResolve()一起恢复瞬态字段

时间:2010-05-10 08:11:41

标签: java serialization transient

根据Serializable javadoc,readResolve()用于替换从流中读取的对象。但肯定(?)你没有来替换对象,所以可以用它来恢复瞬态字段并返回原始引用,如下所示:

private Object readResolve() {
    transientField = something;
    return this;
}

而非使用readObject()

private void readObject(ObjectInputStream s) {
    s.defaultReadObject();
    transientField = something;
}

当用于恢复瞬态场时,有没有理由选择其他的?实际上我倾向于readResolve(),因为它不需要参数,因此在构造“正常”时也可以很容易地使用它,在构造函数中如下:

class MyObject {

    MyObject() {
        readResolve();
    }

    ...
}

2 个答案:

答案 0 :(得分:4)

实际上,readResolve已经定义为您提供对对象反序列化方式的更高控制。因此,您可以自由地做任何您想做的事情(包括为瞬态字段设置值)。

但是,我想你的瞬态场是用一个常数值设置的。在其他地方,这肯定会出现问题:要么你的领域不是那么短暂,要么你的数据模型依赖于错误的假设。

答案 1 :(得分:4)

使用readResolve。如果格式与预期的默认值不同,则readObject方法允许您自定义对象的读取方式。这不是你想要做的。顾名思义,readResolve方法用于在读取对象后解析对象,其目的正是让您解析反序列化后未恢复的对象状态。这就是你要做的。你可以从readResolve返回“this”。