ObjectOutputStream の Javadoc には次のように書かれています。
メソッド writeObject は、オブジェクトをストリームに書き込むために使用されます。文字列や配列を含むすべてのオブジェクトは、writeObject で書き込まれます。複数のオブジェクトまたはプリミティブをストリームに書き込むことができます。オブジェクトは、対応する ObjectInputstream から、書き込まれたときと同じ型および同じ順序で読み戻される必要があります。
と
他のオブジェクトへの参照 (一時フィールドまたは静的フィールドを除く) により、それらのオブジェクトも書き込まれます。単一のオブジェクトへの複数の参照は、参照共有メカニズムを使用してエンコードされるため、オブジェクトのグラフを元のオブジェクトが作成されたときと同じ形状に復元できます。
特に、同じオブジェクトが に繰り返し書き込まれる場合ObjectOutputStream
、そのデータは 1 回だけ書き込まれます。
これを確認するには、次のプログラムを実行します。
class A implements Serializable {
C c;
}
class B implements Serializable {
C c;
}
class C implements Serializable {
}
public class Test {
public static void main(String[] args) throws Exception {
C c = new C();
A a = new A();
a.c = c;
B b = new B();
b.c = c;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
oos.writeObject(a);
oos.writeObject(b);
oos.writeObject(c);
}
byte[] data = baos.toByteArray();
try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data))) {
A newA = (A) ois.readObject();
B newB = (B) ois.readObject();
C newC = (C) ois.readObject();
System.out.println(newA.c == newC && newB.c == newC); // prints "true"
}
}
}