7

根据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();
    }

    ...
}
4

2 回答 2

4

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

但是,我想您的瞬态字段设置为恒定值。在其他地方,这将是出现问题的确定信号:要么您的字段不是那么短暂,要么您的数据模型依赖于错误的假设。

于 2010-05-10T08:19:04.053 回答
4

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

于 2011-11-20T13:08:04.577 回答