2014-09-18 95 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

相关问题