代码之家  ›  专栏  ›  技术社区  ›  Joonas Pulakka

readobject()与readresolve()用于还原临时字段

  •  7
  • Joonas Pulakka  · 技术社区  · 14 年前

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

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

    与使用 readObject() :

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

    当用于恢复瞬态场时,有没有理由选择其中一个?实际上我倾向于 读取解析() 因为它不需要参数,所以在构造对象“正常”时也可以很容易地使用,比如:

    class MyObject {
    
        MyObject() {
            readResolve();
        }
    
        ...
    }
    
    2 回复  |  直到 14 年前
        1
  •  4
  •   Riduidel    14 年前

    事实上,readresolve的定义为您提供了对对象反序列化方式的更高控制。因此,您可以随心所欲(包括为瞬态字段设置值)。

    不过,我想你的瞬变场是一个定值。在其他地方,这将是一个肯定的信号,表明出了问题:要么你的字段没有那么短暂,要么你的数据模型依赖于错误的假设。

        2
  •  4
  •   Jason C    13 年前

    使用readresolve。read object方法允许您自定义对象的读取方式(如果格式不同于预期的默认值)。这不是你想做的。readresolve方法,顾名思义,用于 解决 读取后的对象,其目的正是让您解析反序列化后未还原的对象状态。这就是你想做的。您可以从readresolve返回“this”。