在序列化为JSON时获取OutOfMemoryException?

我正在序列化,一个MultiDictionary

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

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

 String json = JsonConvert.SerializeObject(json, Newtonsoft.Json.Formatting.Indented); 

我错过了什么?

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

更新: –

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

您似乎遇到了导致OutOfMemoryException Ciruclar Reference ,或者您的对象太大而无法记忆。 使用NDepend来检查这一点。

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

假设您没有循环引用 – 如果您无法将整个内容存储在内存中,请使用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); } 

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

编辑:

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