2011-12-25 35 views
9

Sto serializzazione, un MultiDictionary<String,Object>Ottenere un OutOfMemoryException durante la serializzazione su JSON?

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

Ha 618 elementi con elementi in fase di nidificazione, cioè. un singolo oggetto può avere diversi oggetti come il dizionario al suo interno. Sto usando JSON.Net

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

cosa mi manca?

ALTRE INFORMAZIONI: - Questo funzionava bene fino a quando non stavo usando dinamico, ho dovuto passare a MultiDictionary per consentire più proprietà con lo stesso nome. Funziona nella maggior parte dei casi, solo quando il numero di elementi è grande, si interrompe.

UPDATE: -

sono stato in grado di ottenere una sospensione del consumo di memoria, ma il taglio verso il basso su alcuni elementi che sono stati aggiunti in modo ricorsivo ottenendo ad ogni elemento.

risposta

12

Sembra che si stia verificando Ciruclar Reference che sta causando OutOfMemoryException oi tuoi oggetti sono semplicemente troppo grandi per la tua memoria. Utilizzare NDepend per verificare questo.

Potresti trovare utile getting the total size of your objects.

+0

c'è un modo per controllare il riferimento circolare? –

+0

NDepend, vedere la mia risposta modificata –

+1

@ashutoshraina http://www.ndepend.com/Features.aspx#DependencyCycle sembra lo strumento preferito da tutti –

2

È difficile dirlo senza conoscere l'esatta struttura degli oggetti che vengono serializzati, ma è possibile che, dal momento che il grafico dell'oggetto è così grande, potrebbero esserci riferimenti circolari da qualche parte (un oggetto che punta a un oggetto che a sua volta indica al primo oggetto), creando un ciclo infinito di serializzazione.

EDIT:

E 'possibile utilizzare uno strumento, come NDepend, per scoprire dove i riferimenti circolari sono. Prova la versione di prova.

4

Dando per scontato che non si dispone di riferimenti circolari - se non è possibile memorizzare il tutto in memoria di utilizzare uno StreamWriter (JsonWriter o TextWriter) in Newtonsoft v4.0.30319

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

Usa JsonWriter se si sta cercando passare la stringa

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

using(JsonWriter writer = new JsonTextWriter(sw)) 
{ 
    var serializer = new JsonSerializer(); 
    serializer.Serialize(writer, myObject); 
} 
+0

Grazie mille. Dopo tanto mal di testa, finalmente le tue prime soluzioni per quanto riguarda TextWriter è funzionante. Vorrei, se potessi votare per te 10 volte. – Dilip0165

Problemi correlati