2014-09-18 108 views
3

所有,Newtonsoft JSON - OutOfMemoryException異常

環境: ASP.net 2.0,NHibernate的3.3,Json.net(最新,6.x中)

我使用Newtonsoft.Json庫的最新版本。當我使用nhibernate加載一個實體時(我的實體引用了其他實體並且被懶惰地加載),我收到了內存不足異常或堆棧溢出異常。

代碼OutOfMemory例外:

JsonSerializerSettings settings = new JsonSerializerSettings(); 
    settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; 
    settings.PreserveReferencesHandling = PreserveReferencesHandling.Objects; 
    string json = JsonConvert.SerializeObject(container.DataItem, settings); 

代碼計算器例外:

JsonSerializerSettings settings = new JsonSerializerSettings(); 
    settings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; 
    settings.PreserveReferencesHandling = PreserveReferencesHandling.Objects; 
    string json = JsonConvert.SerializeObject(container.DataItem, settings); 

人有這些問題,但似乎無解。我看到你的圖形太大或太深,但我的對象圖很小 - 我只是把代碼調用了很多次(每個對象一次)。我需要解決這個問題。

+0

你確定你的對象圖表很小?你確定它不會不斷地從一個延遲加載的集合遍歷到另一個,逐漸加載整個數據庫? – 2014-09-19 10:38:41

+0

我將在下週確認這一點,但簡單地看看它,我沒有看到任何問題。 – ActiveX 2014-09-19 16:26:36

+0

我剛剛驗證了我的對象圖,它不是對象本身,而是返回的代理是原因(請參閱下面的答案)。 – ActiveX 2014-09-24 16:09:33

回答

3

你這麼NHibernate的手中奪回代理在這裏和那裏使用延遲加載和這些代理有一個System.Type對象,它將具有無限循環,也給本屆的SessionFactory,這將是對自己的沉重的參考文獻,檢查NHibernate.Proxy.INHibernateProxy

因此,要麼:

  • 渴望負載的東西序列化或
  • 直接指定序列化的屬性或
  • 不序列化的實體產品總數
+0

感謝您的好評。我從來沒有詳細看過代理類,但現在有意義。 – ActiveX 2014-09-24 16:08:39

相關問題