在序列化为JSON时获取OutOfMemoryException?

时间:2011-12-25 17:50:32

标签: c# json serialization json.net

我正在序列化,MultiDictionary<String,Object>

http://powercollections.codeplex.com/ to json .

它有618个元素,其元素被深深嵌套,即。单个Object可能包含多个类似字典的对象。我正在使用JSON.Net

String json = JsonConvert.SerializeObject(json, Newtonsoft.Json.Formatting.Indented);
我错过了什么?

更多信息: - 这工作正常,直到我使用动态,我不得不切换到MultiDictionary允许同名的多个属性。它适用于大多数情况,只有当项目数量很大时才会中断。

更新: -

我已经能够控制内存消耗,但减少了一些递归添加到每个元素的元素。

3 个答案:

答案 0 :(得分:13)

您似乎遇到导致OutOfMemoryException的{​​{3}},或者您的对象太大而无法记忆。使用Ciruclar Reference进行检查。

您可能会发现有用的NDepend

答案 1 :(得分:9)

假设您没有循环引用 - 如果您无法将整个内容存储在内存中,请使用Newtonsoft v4.0.30319中的StreamWriter(JsonWriter或TextWriter)

using (TextWriter writer = File.CreateText("LocalJSONFile.JSON"))
{
    var serializer = new JsonSerializer();
    serializer.Serialize(writer, myObject);
}

如果您尝试传递字符串

,请使用JsonWriter
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);

using(JsonWriter writer = new JsonTextWriter(sw))
{
  var serializer = new JsonSerializer();
  serializer.Serialize(writer, myObject);
}

答案 2 :(得分:2)

在不知道被序列化的对象的确切结构的情况下很难分辨,但可能的是,由于对象图如此之大,某处可能存在循环引用(指向的对象)到一个反过来指向第一个对象的对象,创建一个无限循环的序列化。

编辑:

您可以使用NDepend之类的工具来查找循环引用的位置。试试试用版。