Könnyű belefutni az alábbi XML sorosítási hibaüzenetbe, ha webszolgáltatásokat használunk:
System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: A circular reference was detected while serializing an object of type Result.
Például előjöhet akkor, ha LINQ to SQL designer segítségével összerakjuk az alábbi modellt:
Majd utána megírjuk például az alábbi webszolgáltatást:
[WebMethod]
public List<Result> GetTopResults( int count, int songId, int difficulty )
{
HeroDataContext dc = new HeroDataContext();
return dc.Results
.Where( r => r.SongID == songId && r.Difficulty == difficulty )
.OrderByDescending( r => r.Score )
.Take( count )
.ToList();
}
Már a LINQ kifejezés miatt is érdekes a fenti kód, de sajnos az előbb említett hibaüzenetet fogjuk kapni, aminek nyilván az asszociációk az okai. Konkrétan egy LINQ-es asszociáció kétirányú kapcsolatot biztosít például az ábrán látható Song és Result osztályok között. A Result osztálynak lesz SongID és Song tulajdonsága, a Song osztálynak pedig Results gyűjteménye. Ettől persze nagyon kényelmes a használatuk csak éppen a körkörös referenciák a sorosításnál bajt okoznak.
Íme a megoldás: állítsuk az asszociáció gyermek tulajdonságának láthatóságát Internalra:
Ne felejtsük el ezt megtenni minden érintett kapcsolatra és remélhetőleg megoldódik a probléma!