WCF循环引用序列化&;堆栈溢出错误
本文关键字:堆栈 栈溢出 错误 amp 循环 引用 序列化 WCF | 更新日期: 2023-09-27 18:29:37
我有以下问题,给定以下服务约定、数据约定和服务实现,我应该如何让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;
}
}
为什么这个问题是独一无二的?首先,我能找到的每个其他例子都使用对象树,或者使用两个对象之间的循环引用。在树的实例中(Grandparent=>Parent=>Child),关系实际上不是循环的,而是在不同的节点之间使用对象。或者,在第二种情况下,同一个对象是循环的(Person有一个员工列表,也是人员,这是我在MSDN上找到的一个例子),或者它的父=>子=>父关系是循环的,但还不够广泛。
此外,在我的情况下,不可能将对象"展平"为树,它们需要维护相同的对象引用。
提前感谢您对这个问题的任何建议或见解。
我想明白了。
堆栈溢出似乎根本没有发生在WCF中,而是发生在WCF测试客户端中。我认为Visual Studio必须连接到它,因为当它崩溃时,它会在Visual Studio内部爆炸,这就是为什么我认为这是服务的问题。测试客户端将结果显示为一个树,我猜他们没有预料到结果可能是一个循环对象图,从而导致堆栈溢出。
经验教训:不要使用WCF测试客户端。使用控制台应用程序。