我有以下问题,考虑到以下服务契约,数据契约和服务实现,我应该如何让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 =>父关系是循环的,但不够广泛。另外,就我而言,它不可能将对象“扁平化”为一棵树,它们需要维护相同的对象引用。
在此先感谢您对此问题的任何建议或见解。
使用DataContractSerializer的原始实例对此进行测试。看看他的构造函数的递归选项。 – Brannon 2012-03-29 18:58:30
你是试图做互操作还是仅仅是纯粹的WCF通信? – 2012-03-29 19:06:02
@Brannon测试序列化与原始DataContractSerializer似乎序列化正确的图形到控制台,没有任何选项被指定(DataContractSerializer的默认空构造函数),我想这个问题是为什么WCF有这样的问题? – 2012-03-29 19:13:01