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

Joo*_*kka 7 java serialization transient

根据Serializable javadoc,readResolve()用于替换从流中读取的对象.(?),但你肯定不具备更换对象,因此,它是确定以使用它恢复瞬态字段,并返回原来的参考,像这样:

private Object readResolve() {
    transientField = something;
    return this;
}
Run Code Online (Sandbox Code Playgroud)

而不是使用readObject():

private void readObject(ObjectInputStream s) {
    s.defaultReadObject();
    transientField = something;
}
Run Code Online (Sandbox Code Playgroud)

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

class MyObject {

    MyObject() {
        readResolve();
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

Rid*_*del 4

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

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