2011-12-25 114 views
9

我序列化,一个MultiDictionary<String,Object>序列化为JSON时出现OutOfMemoryException?

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

它具有618种元素与元素被深度嵌套,即。单个对象可能会有几个字典,如对象。我正在使用JSON.Net

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

我在想什么?

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

更新: -

我已经能够得到内存消耗的保持,但是削减的是都拿到递归添加到每个元素的一些元素。

回答

12

看来您正在运行Ciruclar Reference,这会导致OutOfMemoryException或您的对象对于您的内存来说太大了。使用NDepend来检查。

你可能会觉得有用getting the total size of your objects

+0

有没有办法检查循环引用? – 2011-12-25 18:10:03

+0

NDepend,看我编辑的答案 – 2011-12-25 18:14:43

+1

@ashutoshraina http://www.ndepend.com/Features.aspx#DependencyCycle似乎是大家的首选工具 – 2011-12-25 18:17:50

2

不知道被序列化的对象的确切结构很难说清楚,但有可能是因为对象图如此之大,在某处可能会有循环引用(一个对象指向一个对象,而该对象依次指向到第一个对象),创建一个无限循环的序列化。

编辑:

您可以使用一个工具,像NDepend,找出了循环引用。试一试试用版。

4

假设你没有循环引用 - 如果你不能存储在内存中的整个事情Newtonsoft使用的StreamWriter(JsonWriter或TextWriter的)v4.0.30319

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); 
} 
+0

非常感谢。经过这么多的头痛之后,最终你的第一个关于TextWriter的解决方案已经奏效。我希望,如果我能为你投票10次。 – Dilip0165 2016-10-20 12:04:35

相关问题