2009-11-24 12 views
14

例:オブジェクトAには、オブジェクトAを含むオブジェクトCを含むオブジェクトBが含まれます。循環参照のJavaシリアル化は機能しますか?

オブジェクトAは正しくシリアル化されますか?

コメント#9 hereは、動作しないことを示します。

対照的に、XStreamは、循環参照を処理することを示します。

+0

私はコメント#9を理解する方法として、彼は公式実装の欠陥についてではなく、手で直列化を実装することの難しさについて話しています。 – meriton

+0

はい、私はそれが手で行われることに同意すると思います。 – Brandon

+0

** TRY **の場合はどうなりますか? –

答えて

14

はい、デフォルトのJavaシリアル化は循環参照のために機能します。オブジェクトCをシリアル化すると、フィールドには、既にシリアル化されたオブジェクトAの逆参照が含まれます。

+2

これはどのように動作するのかについてのドキュメントはありますか?これを私自身のシリアル化実装の1つで処理したいと思います。 –

3

はい、Javaのシリアライゼーションは循環参照に使用されます。詳細は、hereを参照してください。

+1

あなたのリンクから感謝 "循環参照や単一のオブジェクトへの複数の参照のような特殊なケースは、ツリーグラフが再作成されると、ツリー内の別のオブジェクトへの参照がどこにあるべきか新しいオブジェクトが魔法のように表示されないように保持されます。 http://java.sun.com/developer/technicalArticles/ALT/serialization/ – Brandon

0

オブジェクトをXMLにシリアル化すると、参照先を実際に表示できます。子オブジェクトは一度しかシリアル化されません。すでにシリアライズされている子オブジェクトへの参照(シリアル化された構造のどこにでも)は、ファイル内のそのオブジェクトを指しています。

循環参照をシリアライズすると少し混乱することがあります。可能であれば、それらを避けたい場合があります。

1

はい、あります。

私はこれを非常に、非常に簡単なテストでしたし、少なくともシリアル化を終了します。私はそれが正しいと仮定しますが、いくつかの余分な行でそれを確認することができます。

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"); 

    }  
}