2012-03-29 90 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