2012-03-29 12 views
2

Ich habe das folgende Problem, angesichts der folgenden Service-Vertrag, Datenvertrag und Service-Implementierung, wie bekomme ich WCF Serialisierung meiner Objekt Grafik ohne Stapelüberlauf?WCF Rundschreiben Referenz Serialisierung & Stack Overflow Error

Service-Vertrag:

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

Datenverträge

[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; } 
} 

Service Implementation:

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; 
    } 
} 

Warum ist diese Frage so einzigartig? Erstens, jedes andere Beispiel, das ich finden konnte, verwendet einen Baum von Objekten oder es verwendet zirkuläre Referenzen zwischen zwei Objekten. Im Fall eines Baumes (Grandparent => Parent => Child) ist die Beziehung nicht wirklich zirkulär, sondern Objekte werden zwischen verschiedenen Knoten verwendet. Oder im zweiten Fall ist entweder das gleiche Objekt zirkulär (Person hat eine Liste von Mitarbeitern, die auch Personen sind, dies ist in einem der Beispiele, die ich auf der MSDN gefunden habe) oder ihre Eltern => Kind => Elternbeziehung, die ist kreisförmig, aber nicht sehr umfangreich genug.

Auch in meinem Fall ist es nicht möglich, die Objekte in einen Baum "abzuflachen", sie müssen die gleichen Objektreferenzen beibehalten.

Vielen Dank im Voraus für eine Beratung oder Einblick in dieses Problem.

+0

Testen Sie dies mit einer rohen Instanz des DataContractSerializers. Sehen Sie sich seinen Konstruktor für die Rekursionsoptionen an. – Brannon

+0

Versuchen Sie Interop zu machen oder ist dies reine WCF-Kommunikation? –

+0

@Brannon Das Testen der Serialisierung mit einem rohen DataContractSerializer scheint das Diagramm korrekt in der Konsole zu serialisieren, ohne dass irgendwelche Optionen angegeben werden (leerer Standardkonstruktor für DataContractSerializer). Ich nehme an, die Frage ist dann, warum WCF solch ein Problem hat? –

Antwort

4

Ich fand es heraus.

Es scheint, dass der Stapelüberlauf tatsächlich nicht in WCF auftritt, sondern tatsächlich im WCF-Testclient. Ich denke, Visual Studio muss sich damit verbinden, denn wenn es abstürzt, explodiert es im Visual Studio, weshalb ich dachte, dass es ein Problem mit dem Service ist. Der Testclient zeigt das Ergebnis als Baum an, und ich nehme an, dass sie nicht vorausgesehen haben, dass das Ergebnis ein zyklischer Objektgraph sein könnte, also der Stapelüberlauf.

Gelernte Lektion: Verwenden Sie nicht den WCF-Testclient. Verwenden Sie eine Konsolenanwendung.

+0

Es sieht aus wie es im VS2012 WcfTestClient behoben ... – Hamiora