我遇到以下问题,给定以下服务合同,数据合同和服务实现,如何在没有堆栈溢出的情况下让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上找到的一个例子)或者它的父亲=> child =>父母关系是循环的,但不够广泛。
另外,在我的情况下,它不可能将对象“展平”到树中,它们需要保持相同的对象引用。
提前感谢您对此问题的任何建议或见解。
答案 0 :(得分:4)
我明白了。
看起来堆栈溢出根本没有在WCF中发生,它实际上发生在WCF测试客户端中。我认为Visual Studio必须连接到它,因为当它崩溃时,它会在视觉工作室内爆炸,这就是为什么我认为这是服务的问题。测试客户端将结果显示为树,我的猜测是他们没有预料到结果可能是循环对象图,因此堆栈溢出。
经验教训:不要使用WCF测试客户端。使用控制台应用程序。