WCF循环参考序列化&堆栈溢出错误

时间:2012-03-29 18:53:24

标签: c# wcf entity-framework datacontractserializer

我遇到以下问题,给定以下服务合同,数据合同和服务实现,如何在没有堆栈溢出的情况下让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 =>父母关系是循环的,但不够广泛。

另外,在我的情况下,它不可能将对象“展平”到树中,它们需要保持相同的对象引用。

提前感谢您对此问题的任何建议或见解。

1 个答案:

答案 0 :(得分:4)

我明白了。

看起来堆栈溢出根本没有在WCF中发生,它实际上发生在WCF测试客户端中。我认为Visual Studio必须连接到它,因为当它崩溃时,它会在视觉工作室内爆炸,这就是为什么我认为这是服务的问题。测试客户端将结果显示为树,我的猜测是他们没有预料到结果可能是循环对象图,因此堆栈溢出。

经验教训:不要使用WCF测试客户端。使用控制台应用程序。