【问题标题】:WCF Circular Reference Serialization & Stack Overflow ErrorWCF 循环引用序列化和堆栈溢出错误
【发布时间】: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


【解决方案1】:

我想通了。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    相关资源
    最近更新 更多