2011-12-25 16 views
9

estoy serializar, un MultiDictionary<String,Object>Obteniendo una excepción OutOfMemoryException al serializar a JSON?

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

Tiene 618 elementos con elementos que se están profundamente anidados, es decir. un solo Objeto puede tener varios objetos similares a un diccionario. Estoy usando JSON.Net

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

¿Qué me falta?

MÁS INFORMACIÓN: - Esto funcionaba bien hasta que estaba usando Dynamic, tuve que cambiar a MultiDictionary para permitir varias propiedades con el mismo nombre. Funciona para la mayoría de los casos, solo cuando la cantidad de elementos es grande, se rompe.

ACTUALIZACIÓN: -

he sido capaz de obtener una bodega del consumo de memoria, pero reduciendo en algunos de los elementos que se van añadiendo de forma recursiva para cada elemento.

Respuesta

12

Parece que se está ejecutando en Ciruclar Reference que está causando OutOfMemoryException o que sus objetos son simplemente demasiado grandes para su memoria. Use NDepend para verificar esto.

Puede que encuentre útil getting the total size of your objects.

+0

¿hay alguna manera de verificar la referencia circular? –

+0

NDepende, vea mi respuesta editada –

+1

@ashutoshraina http://www.ndepend.com/Features.aspx#DependencyCycle parece ser la herramienta preferida por todos –

2

Es difícil saber sin conocer la estructura exacta de los objetos que se serializan, pero es posible que, dado que el gráfico objeto es tan grande, puede haber referencias circulares en algún lugar (un objeto que apunta a un objeto que a su vez apunta al primer objeto), creando un ciclo infinito de serialización.

EDIT:

Usted puede utilizar una herramienta, como NDepend, para averiguar dónde las referencias circulares son. Pruebe la versión de prueba.

4

Suponiendo que no tiene referencias circulares - si no se puede almacenar toda la cosa en la memoria usar un StreamWriter (JsonWriter o TextWriter) en Newtonsoft v4.0.30319

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

Uso JsonWriter si usted está tratando para pasar la cadena

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

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

Muchas gracias. Después de tanto dolor de cabeza, finalmente se trabajan sus primeras soluciones con respecto a TextWriter. Deseo, si pudiera votar por ti 10 veces. – Dilip0165

Cuestiones relacionadas