を参照してくださいObjectOutputStream.reset
。
リセットは、ストリームに既に書き込まれているオブジェクトの状態を無視します。状態は新品同様にリセットされますObjectOutputStream
。ストリームの現在のポイントはリセットとしてマークされているため、対応ObjectInputStream
するポイントは同じポイントでリセットされます。以前にストリームに書き込まれたオブジェクトは、既にストリームにあるとは見なされません。それらは再びストリームに書き込まれます。
/* prevent using back references */
output.reset();
output.writeObject(...);
同じオブジェクトを書き込む前にリセットを呼び出して、更新された状態がシリアル化されるようにします。それ以外の場合は、古い状態の以前に書き込まれたオブジェクトへの後方参照を使用するだけです。
または、代わりに次のように使用することもできObjectOutputStream.writeUnshared
ます。
「非共有」オブジェクトを に書き込みますObjectOutputStream
。このメソッドはwriteObject
、(以前にシリアル化されたインスタンスを指す逆参照ではなく) 指定されたオブジェクトをストリーム内の新しい一意のオブジェクトとして常に書き込むことを除いて、 と同じです。
具体的には:
writeUnshared を介して書き込まれたオブジェクトは、オブジェクトが以前に書き込まれたかどうかに関係なく、新しく出現したオブジェクト (まだストリームに書き込まれていないオブジェクト) と同じ方法で常にシリアル化されます。
を使用して、以前に writeUnshared で書き込まれたオブジェクトを書き込む場合writeObject
、以前の writeUnshared 操作は、別のオブジェクトの書き込みであるかのように扱われます。つまり、 へのObjectOutputStream
呼び出しによって書き込まれたオブジェクト データへの後方参照は決して生成されませんwriteUnshared
。
を介してオブジェクトを書き込むことwriteUnshared
自体は、逆シリアル化されたときにオブジェクトへの一意の参照を保証しませんが、1 つのオブジェクトをストリーム内で複数回定義できるためreadUnshared
、レシーバーによる への複数回の呼び出しが競合しません。上記の規則は、 で記述されたベースレベル オブジェクトにのみ適用され、writeUnshared
シリアル化されるオブジェクト グラフ内の推移的に参照されるサブオブジェクトには適用されないことに注意してください。
output.writeUnshared(...);
これを と結合することをお勧めしObjectInputStream.readUnshared
ます。
から「非共有」オブジェクトを読み取りますObjectInputStream
。このメソッドは readObject と同じですが、この呼び出しによって取得されたデシリアライズされたインスタンスへの後続の呼び出しreadObject
および追加の参照が返されないようにする点が異なります。readUnshared
具体的には:
readUnshared
逆参照 (以前にストリームに書き込まれたオブジェクトのストリーム表現) を逆シリアル化するために が呼び出された場合、ObjectStreamException
がスローされます。
- 正常
readUnshared
に返された場合、デシリアライズされたストリーム ハンドルへの後方参照をデシリアライズしようとするreadUnshared
と、ObjectStreamException
がスローされます。
経由でオブジェクトを逆シリアルreadUnshared
化すると、返されたオブジェクトに関連付けられたストリーム ハンドルが無効になります。これ自体は、によって返される参照readUnshared
が一意であることを常に保証するわけではないことに注意してください。逆シリアル化されたオブジェクトは、readResolve
他のパーティに表示されるオブジェクトを返すメソッドを定義するか、readUnshared がストリーム内の他の場所または外部手段を通じて取得可能なClass
オブジェクトまたは定数を返す場合があります。enum
逆シリアル化されたオブジェクトがメソッドを定義し、readResolve
そのメソッドの呼び出しが配列をreadUnshared
返す場合、その配列の浅いクローンを返します。readObject
これにより、返された配列オブジェクトが一意であり、 の呼び出しまたは readUnshared で2 回目に取得できないことが保証されます。ObjectInputStream
、基になるデータ ストリームが操作されている場合でも。
obj = input.readUnshared();