WCF无法序列化循环引用

WCF无法序列化循环引用

问题描述:

我有一个数据库与TablesSilverlight客户端之间的很多关系连接到我的服务器与WCF serviceASP.Net方。我的数据库的对象(假设为GetFoo())返回List<Foo>Foo与其他对象有很多关系,每个对象都有很多重复的关系(这意味着表格之间有一个PK和FK)。我还使用Microsoft Service Trace Viewr跟踪我的服务WCF无法序列化循环引用

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

Object graph for type 'X.Y.Z' contains cycles and cannot be serialized if reference tracking is disabled

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

各种选项:

  • 移除模型中的循环依赖;这个可能对于一个生成的模型来说比较棘手,该模型有很多针对它的现有代码,但值得一试尝试;但是,您通常想不序列化,而这正是LINQ到SQL 希望你保持什么(它会让你放下孩子属性,但是这是你平时想什么以序列化)
  • 启用循环引用;看起来你已经尝试过,但没有成功;但是你是否在两端启用了?其实我不会感到惊讶,如果Silverlight不喜欢这个扩展名(它具有有限的扩展支持)
  • 使用单独的(平面)DTO模型进行数据传输
  • 尝试使用NetDataContractSerializer;我不记得Silverlight是否支持这个功能,我必须承认我不是它最大的粉丝,但它可能是一个务实的修复方法

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

+0

@Marc Gravell:我无法删除循环依赖关系,它很多!有任何代码来检测它?如果我想使用DTO,我必须创建并实现200多个对象,并且我有截止日期! – 2010-10-25 07:18:50

+0

@Marc Gravell:启用循环引用?如何做到底? – 2010-10-25 07:22:47

+0

@Meysam - 就像你链接到的博客文章一样;但它需要应用于客户端和服务器。我没有在silverlight中试过,所以我不能评论它是否可能。 – 2010-10-25 07:23:43

有点迟了。但是如果有人正在使用linqtosql并且遇到这个问题,你可以简单地在你的dbml类中打开这些表。右键单击表格并单击属性。 这里有一个名为序列化模式属性..它设置为单向

错误将会消失

我知道这是一个老问题了,但你尝试装饰与您DBML生成的类[ DataContract(IsReference =真)]?

我在2010年遇到了同样的问题,不得不采取一些相当极端的措施来让它在客户端和服务端工作,但最近通过VS2013/.NET4.5返回,并且痛苦少得多,因为这里记录(与EF v6 RC 1 POCO对象):http://sanderstechnology.com/2013/more-with-the-entity-framework-v6-rc1/12423/