La sérialisation d'un objet à l'aide de Json.Net les causes de la Mémoire exception
Disclaimer: je ne suis passé par la plupart de la solution proposée ici, mais la plupart d'entre eux étaient en train de parler à propos de OOM exception lors de la Désérialisation.
Je suis en train de sérialiser un objet( c'est un Arbre) en Json à l'aide de Json.Net. Tout fonctionne bien pour les petits objets, mais je reçois OOM exception quand je l'ai essayer avec de gros objets. Il fonctionne avec les plus petits objets de même type de données que je suis en supposant que il n'y a pas de référence circulaire (j'ai fait inspecter ma structure de données). Est-il un moyen où je peux convertir mon objet dans un flux de données ( c'est une application du Windows Store ) et de générer du Json à l'aide de ce flux ?
public static async Task<bool> SerializeIntoJson<T>(string fileName, StorageFolder destinationFolder, Content content)
{
ITraceWriter traceWriter = new MemoryTraceWriter();
try
{
string jsonString = JsonConvert.SerializeObject(content, Formatting.Indented, new JsonSerializerSettings
{
PreserveReferencesHandling = PreserveReferencesHandling.Objects,
TypeNameHandling = TypeNameHandling.All,
Error = ReportJsonErrors,
TraceWriter = traceWriter,
StringEscapeHandling = StringEscapeHandling.EscapeNonAscii
});
System.Diagnostics.Debug.WriteLine(traceWriter);
StorageFile file = await destinationFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
await Windows.Storage.FileIO.WriteTextAsync(file, jsonString);
return true;
}
catch (NullReferenceException nullException)
{
System.Diagnostics.Debug.WriteLine(traceWriter);
logger.LogError("Exception happened while serializing input object, Error: " + nullException.Message);
return false;
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine(traceWriter);
logger.LogError("Exception happened while serializing input object, Error: " + e.Message, e.ToString());
return false;
}
}
Afin de convertir mon objet dans les cours d'eau, le code que j'ai trouvé à l'aide d'un BinaryFormatter qui n'est pas disponible dans l'app store de Windows dll.
JsonSerializer
combiné avec un StreamReader
comme indiqué here.Je n'ai regardé le code et qui m'a amené à la question : Est-il possible où je peux convertir mon objet dans un flux de données ( c'est une application du Windows Store )?
C'est ce que le Sérialiseur. Il prend toutes les propriétés et les convertit en des chaînes. Dans ce cas, au lieu de retourner chaînes qu'il peut les déposer directement dans un cours d'eau (comme un fichier de flux), de sorte qu'ils ne sont pas assis dans la mémoire.
Ok cela a fonctionné, j'ai eu l'TraceListner qui a été la création de chaînes en interne avec chacun de sérialisation et de désérialisation.
Peut-être que Nate Diamant pourrait ajouter une réponse, de sorte qu'il peut être accepté. A fonctionné pour moi aussi!
OriginalL'auteur Jack_2060 | 2014-09-30
Vous devez vous connecter pour publier un commentaire.
C'est en raison du très grand nombre d'enregistrements que vous essayez de sérialiser, qui occupe une grande mémoire. Les Solutions que j'ai trouvé pour cette erreur que directement à la rédaction de documents à l'aide de StreamWriter(JsonWriter ou TextWriter).
Si vous avez l'utilisation des Objets TextWrite
Si vous avez de la chaîne d'utiliser StringWriter
OriginalL'auteur Dilip0165
Mis à jour le Code en se basant sur les suggestions dans les commentaires sur la question, Cela fonctionne!
OriginalL'auteur