根据Serializable javadoc,readResolve()用于替换从流中读取的对象。但是可以肯定(?)不必替换对象,因此可以使用它来还原 transient 字段并返回原始引用,如下所示:

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

而不是使用readObject():
private void readObject(ObjectInputStream s) {
    s.defaultReadObject();
    transientField = something;
}

当仅用于恢复 transient 字段时,是否有任何理由选择一个?实际上,我倾向于readResolve(),因为它不需要参数,因此在“正常”构造对象时也可以轻松使用它,例如:
class MyObject {

    MyObject() {
        readResolve();
    }

    ...
}

最佳答案

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

但是,我想您的 transient 字段设置为一个恒定值。在其他地方,这肯定是有问题的迹象:您的字段不是那么短暂,或者您的数据模型依赖于错误的假设。

关于java - readObject()与readResolve()还原临时字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2801206/

10-13 09:23