2011-12-25 5 views
9

私はそれが深くネストされている要素、すなわちと618個の要素を持っている、MultiDictionary<String,Object>のOutOfMemoryExceptionを取得しますか?

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

をシリアル化しています。 1つのオブジェクトに複数のディクショナリのようなオブジェクトが含まれることがあります。私はJSON.Netを使用しています

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

私は何が欠けていますか?

詳細情報: ダイナミックを使用するまでこれはうまくいきました。同じ名前の複数のプロパティを許可するには、MultiDictionaryに切り替える必要がありました。それは壊れ、アイテムの数が多いときにのみ、ほとんどの場合のために働きます。

UPDATE: -

私は、メモリ消費量のホールドを取得することができたが、各要素に再帰的に追加取得し、いくつかの要素を減らしてきました。

答えて

12

あなたがOutOfMemoryExceptionを引き起こしていることCiruclar Referenceに実行しているか、あなたのオブジェクトは、単にあなたの記憶には大きすぎるように思われます。これを確認するためにNDependを使用してください。

便利なgetting the total size of your objectsがあります。

+0

循環参照をチェックする方法はありますか? –

+0

NDependの、私の編集した答え –

+1

@ashutoshraina http://www.ndepend.com/Features.aspx#DependencyCycleを見るには、どうもありがとうみんな –

2

オブジェクトの正確な構造を知らないとわかりにくいですが、オブジェクトグラフが大きすぎるため、循環参照がどこかにある可能性があります最初のオブジェクトに)、無限ループの直列化を作成します。

EDIT:

あなたは循環参照がどこにあるかを見つけるために、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

関連する問題