La mia applicazione serializza un oggetto utilizzando Json.Net, comprime il JSON risultante, quindi lo salva in un file. Inoltre l'applicazione può caricare un oggetto da uno di questi file. Questi oggetti possono essere decine di MB di dimensione e sono preoccupati per l'utilizzo della memoria, a causa del modo in cui il codice esistente crea grandi stringhe e array di byte: -Posso decomprimere e deserializzare un file utilizzando i flussi?
public void Save(MyClass myObject, string filename)
{
var json = JsonConvert.SerializeObject(myObject);
var bytes = Compress(json);
File.WriteAllBytes(filename, bytes);
}
public MyClass Load(string filename)
{
var bytes = File.ReadAllBytes(filename);
var json = Decompress(bytes);
var myObject = JsonConvert.DeserializeObject<MyClass>(json);
}
private static byte[] Compress(string s)
{
var bytes = Encoding.Unicode.GetBytes(s);
using (var ms = new MemoryStream())
{
using (var gs = new GZipStream(ms, CompressionMode.Compress))
{
gs.Write(bytes, 0, bytes.Length);
gs.Close();
return ms.ToArray();
}
}
}
private static string Decompress(byte[] bytes)
{
using (var msi = new MemoryStream(bytes))
{
using (var mso = new MemoryStream())
{
using (var gs = new GZipStream(msi, CompressionMode.Decompress))
{
gs.CopyTo(mso);
return Encoding.Unicode.GetString(mso.ToArray());
}
}
}
}
Mi chiedevo se i metodi Save/carico può essere sostituito con flussi? Ho trovato esempi di utilizzo di stream con Json.Net, ma sto cercando di capire come adattarmi alla compressione aggiuntiva.
Questo può rivelarsi interessa a te http://benfoster.io/blog/aspnet-web-api-compression –
@Roy Ho visto eccezioni OOM ultimamente e questo codice sembrava il colpevole logica. Sto aspettando che il profiler della memoria VS finisca di generare il suo report (quindi lento ...), quindi presto avrò un'idea migliore, ma ho pensato di provare a refactoring questo codice mentre sto twittando i miei pollici! –
@AndrewStephens Ah goodo. Forse menziona la tua OOM nella domanda. In bocca al lupo! – MickyD