【问题标题】:WCF can't serialize cyclic referencesWCF 无法序列化循环引用
【发布时间】:2010-10-25 06:33:59
【问题描述】:

我有一个在TablesSilverlight 客户端之间有很多关系的数据库,该客户端通过ASP.Net 端的WCF service 连接到我的服务器。

首先,我使用LINQ to SQL 作为强大的映射表来对象和WebMethod,它返回我数据库对象的List<Foo>(假设GetFoo())。 Foo 与其他对象有很多关系,每个对象也有很多关系,(这意味着表之间存在 PK 和 FK)。我也使用 Microsoft Service Trace Viewr 跟踪我的服务

当我调用 GetFoo() 时,WCF 返回此错误:

“X.Y.Z”类型的对象图包含循环,如果出现以下情况则无法序列化 参考跟踪已禁用

我搜索了这个错误并找到了this great post,但这不能正常工作,我也看到了同样的错误。

【问题讨论】:

    标签: c# wcf serialization silverlight-4.0


    【解决方案1】:

    多种选择:

    • 从你的模型中移除循环依赖;这可能对于一个有大量现有代码的生成模型来说很棘手,但值得一试尝试;但是,您通常不想序列化 ,这正是 LINQ-to-SQL 想要您保留的(它会让你删除了 children 属性,但这是你通常想要序列化的)
    • 启用循环引用;看起来你已经尝试过了,但没有成功;不过,您是否在两端启用了它?实际上,如果 Silverlight 不喜欢这个扩展,我不会感到惊讶(它对扩展的支持有限)
    • 使用单独的(平面)DTO 模型进行数据传输
    • 尝试使用 NetDataContractSerializer;我不记得 Silverlight 是否支持此功能,我必须承认我不是它的忠实粉丝,但这可能是一个实用的解决方案

    我会坚定地投票给“DTO 模型”类别;简而言之,拥有一个单独的模型意味着您在调整数据库时不太可能遇到缠结 - 并且您可以完全控制它。

    【讨论】:

    • @Marc Gravell:我无法删除循环依赖,太多了!有任何代码来检测它吗?如果我想使用 DTO,我必须创建和实现 200 多个对象,而且我有截止日期!
    • @Marc Gravell:启用循环引用?到底怎么办?
    • @Meysam - 就像您链接到的博客文章一样;但它需要在客户端和服务器上都应用。我还没有在 Silverlight 中尝试过,所以我无法评论它是否可能。
    • @Marc Gravell: 以及如何自动找到循环依赖?有什么办法吗?
    • @Meysam - 好吧,你可以很容易地用反射写一些东西,简单地遍历属性
    【解决方案2】:

    这有点晚了。但是,如果有人在使用 linqtosql 并遇到此问题,您只需打开 dbml 类中的表即可。右键单击表旁边,然后单击属性。 这里有一个名为 Serialization Mode 的属性.. 将其设置为单向

    错误会消失

    【讨论】:

      【解决方案3】:

      我知道这是一个老问题了,但是您是否尝试使用 [DataContract(IsReference=True)] 修饰 DBML 生成的类?

      我在 2010 年遇到了同样的问题,不得不采取一些相当极端的措施来让它在客户端和服务端工作,但最近用 VS2013/.NET 4.5 重新解决了这个问题,并且痛苦少了很多,如文档所述这里(使用 EF v6 RC 1 POCO 对象):http://sanderstechnology.com/2013/more-with-the-entity-framework-v6-rc1/12423/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多