【发布时间】:2015-10-05 08:08:46
【问题描述】:
我的应用程序使用 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());
}
}
}
}
我想知道是否可以将 Save/Load 方法替换为流?我找到了在 Json.Net 中使用流的示例,但我正在努力弄清楚如何适应额外的压缩内容。
【问题讨论】:
-
@Roy 我最近一直看到 OOM 异常,这段代码似乎是合乎逻辑的罪魁祸首。我正在等待 VS 内存分析器完成生成它的报告(太慢了......),所以我很快就会有一个更好的主意,但我想我会尝试重构这段代码,而我正在玩弄我的拇指!跨度>
-
@AndrewStephens 啊,好。也许在问题中提及您的OOM。祝你好运!
标签: c# stream json.net gzipstream