使用Json.Net序列化實體框架對象

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

如何將實體框架對象序列化為JavaScript Object(JSON)?我嘗試使用JSON.NET但是當我嘗試序列化它時,我得到以下異常。

例外:Newtonsoft.Json.JsonSerializationException,Message =“Self referencing loop”

亞太區首席技術官Matt

一般承認的答案

聽起來,就循環引用而言,您遇到與原始DataContract序列化程序相同的一般問題。雖然相互引用的對象與內存中的對像圖相當常見,但如果序列化程序沒有特別考慮它,則這種循環引用在序列化時不可避免地會導致無限遞歸。在常見的非二進制序列化格式中處理循環引用的建立標準很少(如果有的話)(XML和JSON是最常見的兩種)。

Microsoft通過在xml中使用ref語義解決了.NET 3.5 SP1中DataContract序列化程序的循環問題。據我所知,JSON沒有這樣的東西,這可能就是JSON.NET阻止你序列化對像圖形的原因。

我會確保你的對像圖中只有可以單嚮導航的引用,而不是兩種方式(即只從父對子,而不是從子到父。)那些父/子和子/父是最常見的循環引用的類型。也可能是較低級別的子級最終引用了圖形的根,導致創建間接循環圖(但這些圖形往往遠不如父/子循環那麼常見)。

消除對像圖中的任何循環引用後,您應該能夠序列化。


熱門答案

我有這個問題並通過將Newtonsoft.Json.JsonIgnoreAttribute添加到導致循環的屬性來解決它。顯然,該屬性不會被序列化。為了解決這個問題,我通常會在我的實體中同時擁有外部引用ID和外部類。我意識到這不是直觀的(或超級優秀的OO),但它是Julia Lerman在她的“編程實體框架:代碼優先”一書中推薦的方式。我發現它有助於消除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合法嗎? 是的,了解原因