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中,而是发生在WCF测试客户端中。我认为Visual Studio必须连接到它,因为当它崩溃时,它会在Visual Studio内部爆炸,这就是为什么我认为这是服务的问题。测试客户端将结果显示为一个树,我猜他们没有预料到结果可能是一个循环对象图,从而导致堆栈溢出。

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