例:オブジェクトAには、オブジェクトAを含むオブジェクトCを含むオブジェクトBが含まれます。循環参照のJavaシリアル化は機能しますか?
オブジェクトAは正しくシリアル化されますか?
コメント#9 hereは、動作しないことを示します。
対照的に、XStreamは、循環参照を処理することを示します。
例:オブジェクトAには、オブジェクトAを含むオブジェクトCを含むオブジェクトBが含まれます。循環参照のJavaシリアル化は機能しますか?
オブジェクトAは正しくシリアル化されますか?
コメント#9 hereは、動作しないことを示します。
対照的に、XStreamは、循環参照を処理することを示します。
はい、デフォルトのJavaシリアル化は循環参照のために機能します。オブジェクトCをシリアル化すると、フィールドには、既にシリアル化されたオブジェクトAの逆参照が含まれます。
これはどのように動作するのかについてのドキュメントはありますか?これを私自身のシリアル化実装の1つで処理したいと思います。 –
オブジェクトをXMLにシリアル化すると、参照先を実際に表示できます。子オブジェクトは一度しかシリアル化されません。すでにシリアライズされている子オブジェクトへの参照(シリアル化された構造のどこにでも)は、ファイル内のそのオブジェクトを指しています。
循環参照をシリアライズすると少し混乱することがあります。可能であれば、それらを避けたい場合があります。
はい、あります。
私はこれを非常に、非常に簡単なテストでしたし、少なくともシリアル化を終了します。私はそれが正しいと仮定しますが、いくつかの余分な行でそれを確認することができます。
import java.io.*;
class A implements Serializable { B b; }
class B implements Serializable { C c; }
class C implements Serializable { A a; }
class Test {
public static void main(String [] args) throws IOException {
A a = new A();
a.b = new B();
a.b.c = new C();
a.b.c.a = a;
new ObjectOutputStream(new ByteArrayOutputStream()).writeObject(a);
System.out.println("It works");
}
}
私はコメント#9を理解する方法として、彼は公式実装の欠陥についてではなく、手で直列化を実装することの難しさについて話しています。 – meriton
はい、私はそれが手で行われることに同意すると思います。 – Brandon
** TRY **の場合はどうなりますか? –