WCF无法序列化循环引用

时间:2010-10-25 06:34:00

标签: c# wcf serialization silverlight-4.0

我的数据库中TablesSilverlight客户端之间存在大量关系,该客户端WCF serviceASP.Net与我的服务器连接。

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

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

  

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

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

3 个答案:

答案 0 :(得分:5)

各种选择:

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

我会在“DTO模式”类别中坚决投票;简单地说,拥有一个单独的模型意味着每当你调整数据库时你就不太可能遇到纠结 - 你完全可以控制它。

答案 1 :(得分:2)

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

错误将消失

答案 2 :(得分:1)

我现在知道这是一个老问题,但您是否尝试使用[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/