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 を使用します。readObject メソッドを使用すると、フォーマットが予想されるデフォルトと異なる場合に、オブジェクトの読み取り方法をカスタマイズできます。これはあなたがやろうとしていることではありません。readResolve メソッドは、その名前が示すように、読み取られた後にオブジェクトを解決するためのものであり、その目的は、逆シリアル化後に復元されないオブジェクトの状態を解決できるようにすることです。これがあなたがやろうとしていることです。readResolve から「this」を返すことができます。

于 2011-11-20T13:08:04.577 に答える
4

実際、readResolve は、オブジェクトをデシリアライズする方法をより細かく制御できるように定義されています。結果として、(transient フィールドの値の設定を含めて) やりたいことを自由に行うことができます。

ただし、一時フィールドには定数値が設定されていると思います。他の場所では、何かが間違っていることの確かな兆候です。フィールドがそれほど一時的ではないか、データモデルが誤った仮定に依存しているかのいずれかです。

于 2010-05-10T08:19:04.053 に答える