Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WCF can't serialize cyclic references

I have a database with a lots of relationships between Tables and a Silverlight client that connects to my server with WCF service on ASP.Net side.

First i used LINQ to SQL as a robust mapper tables to object and in a WebMethod that returns a List<Foo> of my Database's object(suppose GetFoo()). The Foo has lots of relationships with other objects that each of that have lots of realaships too,(this means , there is a PK and FK between tables).also i use Microsoft Service Trace Viewr for track my service

When i call GetFoo() , WCF returns this error:

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

I searched this error and find this great post but that is not working properly and i see same error too.

like image 250
Meysam Javadi Avatar asked Feb 27 '23 00:02

Meysam Javadi


1 Answers

Various options:

  • remove the cyclic dependencies from your model; this might be tricky for a generated model that has lots of existing code built against it, but is worth a try; however, you typically want to not serialize the parent, which is exactly what LINQ-to-SQL wants you to keep (it'll let you drop the children property, but that is what you usually want to serialize)
  • enable cyclic references; it looks like you've tried this without success; did you enable it at both ends, though? Actually I wouldn't be surprised if Silverlight doesn't like this extension (it has limited extension support)
  • use a separate (flat) DTO model for data transfer purposes
  • try using NetDataContractSerializer; I can't remember if this is supported in Silverlight, and I must admit I'm not its biggest fan, but it might be a pragmatic fix here

I'd vote firmly in the "DTO model" category; simply, having a separate model means you are less likely to run into tangles whenever you tweak the DB - and you are in complete control over it.

like image 151
Marc Gravell Avatar answered Mar 10 '23 13:03

Marc Gravell