【发布时间】:2012-03-29 18:53:24
【问题描述】:
我有以下问题,给定以下服务契约、数据契约和服务实现,我应该如何让 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 上找到的示例之一),或者它的父 => 子 => 父关系是圆形的,但不够广泛。
另外,就我而言,不可能将对象“扁平化”成树,它们需要保持相同的对象引用。
提前感谢您对此问题的任何建议或见解。
【问题讨论】:
-
使用 DataContractSerializer 的原始实例对此进行测试。查看他的构造函数中的递归选项。
-
您是在尝试进行互操作还是仅是纯 WCF 通信?
-
@Brannon 使用原始 DataContractSerializer 测试序列化似乎将图形正确序列化到控制台,没有指定任何选项(DataContractSerializer 的默认空构造函数),我想问题是为什么 WCF有这样的问题吗?
-
@DrewMarsh 它需要是纯 WCF,通过网络连接到远程服务器。这实际上只是我正在研究的问题的一个小版本,目的是减少所有其他潜在问题和噪音。
标签: c# wcf entity-framework datacontractserializer