2012-03-29 8 views
2

次のサービス契約、データコントラクト、およびサービスの実装では、スタックオーバーフローなしでオブジェクトグラフをシリアル化するためにWCFを取得する方法を教えてください。WCF循環参考シリアル化とスタックオーバーフローエラー

サービス契約:

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract] 
    TestObjectA CircularSerializationTest(); 
} 

データは

[DataContract(IsReference = true)] 
public class TestObjectA 
{ 
    [DataMember] 
    public TestObjectB B { get; set; } 
} 

[DataContract(IsReference = true)] 
public class TestObjectB 
{ 
    [DataMember] 
    public TestObjectC C { get; set; } 
} 

[DataContract(IsReference = true)] 
public class TestObjectC 
{ 
    [DataMember] 
    public TestObjectA A { get; set; } 
} 

サービス実装をコントラクト:

public class Service1 : IService1 
{ 
    public TestObjectA CircularSerializationTest() 
    { 
     var a = new TestObjectA(); 
     var b = new TestObjectB(); 
     var c = new TestObjectC(); 

     a.B = b; 
     b.C = c; 
     c.A = a; 

     return a; 
    } 
} 

なぜこの質問はユニークですか?まず、私が見つけた他のすべての例では、オブジェクトのツリーを使用するか、2つのオブジェクト間で循環参照を使用します。ツリーのインスタンス(Grandparent => Parent => Child)では、関係は実際には循環はしませんが、オブジェクトは異なるノード間で使用されます。または、2番目のケースでは、同じオブジェクトが円形です(Personには人物の従業員のリストがありますが、これはMSDNで見つかった例の1つにあります)またはその親=>子=>親関係円形であるが、十分に広範囲ではない。

また、私の場合、オブジェクトをツリーに「平坦化」することはできませんが、同じオブジェクト参照を維持する必要があります。

この問題に関するアドバイスや洞察を事前にお寄せいただきありがとうございます。

+0

DataContractSerializerの生のインスタンスでこれをテストします。再帰オプションについては、コンストラクタを見てください。 – Brannon

+0

interopを実行しようとしていますか、この純粋なWCF通信のみですか? –

+0

@Brannon未処理のDataContractSerializerでシリアル化をテストすると、オプションが指定されていない状態でコンソールにグラフが正しくシリアル化されているように見えます(DataContractSerializerのデフォルトの空のコンストラクタ)。 –

答えて

4

私はそれを理解しました。

WCFでは、スタックオーバーフローが実際には発生していないようですが、実際にはWCFテストクライアントで発生しています。私はVisual StudioがクラッシュするとVisual Studioの内部を吹き飛ばして、それがサービスの問題だと思ったからです。テストクライアントは結果をツリーとして表示します。私は、結果が循環オブジェクトグラフになる可能性はないと予想しているため、スタックオーバーフローが発生します。

教訓:WCFテストクライアントを使用しないでください。コンソールアプリケーションを使用します。

+0

VS2012 WcfTestClientで修正されたようです... – Hamiora