ASP.NETMVCフロントレイヤーを介してサーバーからJSONリストを返そうとしています。
var stuff = repo.GetStuff();
return Json(stuff);
ただし、予期されたJSONの代わりに、次のようなエラーメッセージが表示されます
タイプ'System.Reflection.RuntimeModule'のオブジェクトをシリアル化しているときに、循環参照が検出されました。
私はこれがどこで起こるかを見つけたと思いますが、それを説明するために、次のような簡単なドメインモデルの例が必要です。
私は(怠惰に?)NHibernateから選択したドキュメントを次のようにロードしています:
var session = getNHibernateSession();
var query = new NhQueryable<Document>(session.GetSessionImplementation());
var docs = query.ToList().AsEnumerable();
次に、ドキュメントを渡しJsonResult
てコントローラーにを返します。
return Json(docs, JsonRequestBehavior.AllowGet);
これでJson()
、コレクションを封印すると、ドキュメントのプロパティを調べて人を見つけます。その人をシリアル化し、プロジェクトを見つけます。それはプロジェクトをシリアル化し、-そうです-その人を再び見つけます!私は遅延読み込みを行っているので、何も停止しなくてもずっと歩き続けることができますが、循環参照エラーによって停止します。
これらすべてのレベルを下げる必要はありません(最初にプロジェクトをロードしなくても大丈夫です)-Json()
たとえば、2レベル下がらないように、このコレクションのシリアル化方法に何らかの影響を与えることができますか?少し調べてみましたが、ほとんどの場合、.NET MVCの組み込み機能を使用するのではなく、シリアル化ライブラリを直接使用することにした人からのもののようです。(注:この問題の解決策は、この場合に特に適用できる必要があります。アプリケーション内のどこかで、プロジェクトを含む人々のJSONリストを取得したい場合があるからです...)