次のサービス契約、データコントラクト、およびサービスの実装では、スタックオーバーフローなしでオブジェクトグラフをシリアル化するために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つにあります)またはその親=>子=>親関係円形であるが、十分に広範囲ではない。
また、私の場合、オブジェクトをツリーに「平坦化」することはできませんが、同じオブジェクト参照を維持する必要があります。
この問題に関するアドバイスや洞察を事前にお寄せいただきありがとうございます。
DataContractSerializerの生のインスタンスでこれをテストします。再帰オプションについては、コンストラクタを見てください。 – Brannon
interopを実行しようとしていますか、この純粋なWCF通信のみですか? –
@Brannon未処理のDataContractSerializerでシリアル化をテストすると、オプションが指定されていない状態でコンソールにグラフが正しくシリアル化されているように見えます(DataContractSerializerのデフォルトの空のコンストラクタ)。 –