我的应用程序使用Json.Net序列化一个对象,压缩生成的JSON,然后将其保存到文件中。另外,应用程序可以从这些文件之一加载对象。这些对象可以在大小几十MB,我很担心内存使用情况,由于道路现有的代码创建大型字符串和字节数组: -我可以使用流对文件进行解压缩和反序列化吗?
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());
}
}
}
}
我在想,如果在保存/载入的方法可以被流替换?我已经找到了与Json.Net一起使用流的例子,但我正在努力弄清楚如何适应额外的压缩内容。
这可能成为吸引您http://benfoster.io/blog/aspnet-web-api-compression –
@Roy我最近看到的OOM异常,这段代码似乎是合乎逻辑的罪魁祸首。我正在等待VS内存分析器完成生成报告(这么慢......),所以我很快就会有一个更好的主意,但是我认为我会在重新编写代码的同时重新编排我的拇指! –
@AndrewStephens啊goodo。也许在问题中提到你的OOM。祝你好运! – MickyD