Newtonsoft Json - OutOfMemoryException

3

大家好,

环境: 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);

许多人都遇到这些问题,但似乎没有解决方案。我看到有人回复说你的图太大或太深,但我的对象图很小-我只是调用上面的代码很多次(每个对象一次)。我需要一个解决方法。


你确定你的对象图很小吗?你确定它不会不断地从一个延迟加载的集合遍历到另一个集合,逐渐加载整个数据库吗? - Andrew Shepherd
我下周会确认一下,但是初步看了一下,我没有发现任何问题。 - ActiveX
我刚刚验证了我的对象图,问题不在对象本身,而是返回的代理引起的(请参见下面的答案)。 - ActiveX
1个回答

3
您正在使用延迟加载,因此NHibernate在这里和那里都会返回代理。这些代理引用了一个System.Type对象,其中将出现无限循环,还有一个对于会话和会话工厂的引用,它本身就会很重,检查NHibernate.Proxy.INHibernateProxy。
所以,要么:
- 急切地加载要序列化的内容; - 直接指定要序列化的属性; - 根本不序列化实体。

感谢您的出色回答。我以前从未详细研究过代理类,但现在这很有道理。 - ActiveX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接