2011-12-25 113 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

相關問題