2012-03-29 82 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; 
    } 
} 

爲什麼是這個問題的獨特之處?首先,我已經能夠找到的每個其他示例都使用對象樹,或者它使用兩個對象之間的循環引用。在樹的實例(祖父母=>父母=>孩子)中,關係實際上並不是圓形的,但是在不同節點之間使用對象。或者,在第二種情況下,要麼同一個對象是循環的(Person有一個僱員也是人員的列表,這是我在MSDN上找到的一個例子)或者它的一個parent => child =>父關係是循環的,但不夠廣泛。另外,就我而言,它不可能將對象「扁平化」爲一棵樹,它們需要維護相同的對象引用。

在此先感謝您對此問題的任何建議或見解。

+0

使用DataContractSerializer的原始實例對此進行測試。看看他的構造函數的遞歸選項。 – Brannon 2012-03-29 18:58:30

+0

你是試圖做互操作還是僅僅是純粹的WCF通信? – 2012-03-29 19:06:02

+0

@Brannon測試序列化與原始DataContractSerializer似乎序列化正確的圖形到控制檯,沒有任何選項被指定(DataContractSerializer的默認空構造函數),我想這個問題是爲什麼WCF有這樣的問題? – 2012-03-29 19:13:01

回答

4

我想通了。

看來堆棧溢出實際上並不在WCF中發生,它實際上是在WCF測試客戶端中發生的。我認爲Visual Studio必須連接到它,因爲它在崩潰時會在Visual Studio內部爆炸,這就是爲什麼我認爲這是服務的問題。測試客戶端將結果顯示爲樹狀圖,我的猜測是他們沒有預料到結果可能是循環對象圖,因此堆棧溢出。

經驗教訓:不要使用WCF測試客戶端。使用控制檯應用程序。

+0

它看起來像它在VS2012 WcfTestClient中的固定... – Hamiora 2013-06-25 09:23:05