Json.Netを使用してEntity Frameworkオブジェクトをシリアル化する

asp.net-mvc entity-framework javascript json.net

質問

エンティティフレームワークオブジェクトをJavaScript Object(JSON)にシリアル化する方法を教えてください。 JSON.NETを使用しようとしましたが、シリアライズしようとすると次の例外が発生します。

例外:Newtonsoft.Json.JsonSerializationException、メッセージ= "自己参照ループ"

ハイテッシュ

受け入れられた回答

循環参照に関しては、元のDataContractシリアライザと同じ一般的な問題があるようです。オブジェクトを互いに参照することはメモリ内のオブジェクトグラフではかなり一般的ですが、シリアライザが特に考慮しない場合、このような循環参照は、シリアライズ時に必然的に無限の再帰をもたらします。一般的な非バイナリシリアル化形式の循環参照を処理するための確立された標準は、あるとしてもほとんどありません(XMLとJSONが2つの最も普及している)。

Microsoftは、xmlのrefセマンティクスを利用することによって、.NET 3.5 SP1のDataContractシリアライザの周期的な問題を解決しました。私の知る限りでは、JSONにはそのようなことはないため、JSON.NETがオブジェクトグラフのシリアル化を妨げているのかもしれません。

両方向ではなく、一方向にナビゲートできるオブジェクトグラフ内の参照のみがあることを確認します(つまり、親から子へのみ、子から親へではありません)。循環参照のタイプまた、低レベルの子が最終的にグラフのルートを参照しているため、間接循環グラフが作成される可能性があります(ただし、これらは親子ループよりもはるかに一般的ではありません)。

オブジェクトグラフの循環参照を削除したら、シリアル化できるはずです。


人気のある回答

私はこの問題を抱えていて、Newtonsoft.Json.JsonIgnoreAttributeをループを引き起こしているプロパティに追加することによってそれを解決しました。明らかに、そのプロパティはシリアル化されません。この問題を解決するために、私は通常、私のエンティティに外部参照IDと外部クラスの両方を持っています。私はこれが直感的でない(または超素晴らしいオブジェクト指向)ではないことを理解していますが、Julia Lermanが著書 『Programming Entity Framework:Code First』で推奨している方法です。私はそれがEntity Frameworkに関するいくつかの問題を解決するのに役立つことがわかりました。

 public class SomeEntity
 {
      [JsonIgnore]
      public ForeignEntity SomeForeignEntity {get;set;}
      public Guid ForeignEntityId {get;set;}
 }

更新日:私はまた、DbContextのプロキシを無効にする必要があることを言及するのを忘れていました:

dataContext.Configuration.ProxyCreationEnabled = false;

サービスのコードを書いているなら(これはシリアライズしていると思われるかもしれませんが)、おそらく問題にはなりませんが、プロキシの作成を無効にすると失うことがいくつかあります。詳細はこちらをご覧ください。http//www.sellsbrothers.com/posts/Details/12665

私はMS Web Apiを使用しているので、コントローラを構築するときにプロキシ作成を無効にします。

public class MailingApiController : ApiController
{
    public MailingApiController()
    {
        PreventDeepSerialization();
    }

    private static void PreventDeepSerialization()
    {
        var dataContext = Injector.Get<IIntertwyneDbContext>();
        dataContext.Configuration.ProxyCreationEnabled = false;
    }
      ....


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ