在序列化为JSON时获取OutOfMemoryException?

ash*_*ina 12 c# serialization json json.net

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

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

它有618个元素,其中元素是深层嵌套的,即单个Object可能有几个类似于字典的对象.我正在使用JSON.Net

String json = JsonConvert.SerializeObject(json, Newtonsoft.Json.Formatting.Indented);
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

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

更新: -

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

Tom*_*ski 13

您似乎遇到了导致Ciruclar ReferenceOutOfMemoryException或您的对象太大而无法记忆的问题.使用NDepend来检查这一点.

您可能会发现有用的方法可以获得对象的总大小.


Sam*_*Sam 9

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

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

如果您尝试传递字符串,请使用JsonWriter

StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);

using(JsonWriter writer = new JsonTextWriter(sw))
{
  var serializer = new JsonSerializer();
  serializer.Serialize(writer, myObject);
}
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢。经过这么多头痛之后,终于可以使用有关TextWriter的第一个解决方案了。我希望我能投票给你十次。 (2认同)