And*_*ens 6 c# stream json.net gzipstream
我的应用程序使用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());
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道Save/Load方法是否可以用流代替?我已经找到了使用Json.Net的流的例子,但我很难理解如何适应额外的压缩内容.
JsonSerializer有从a JsonTextReader和a 序列化的方法StreamWriter,这两种方法都可以在任何类型的流上创建,包括a GZipStream.使用它们,您可以创建以下扩展方法:
public static class JsonExtensions
{
// Buffer sized as recommended by Bradley Grainger, https://faithlife.codes/blog/2012/06/always-wrap-gzipstream-with-bufferedstream/
const int BufferSize = 8192;
public static void SerializeToFileCompressed(object value, string path, JsonSerializerSettings settings)
{
using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read))
SerializeCompressed(value, fs, settings);
}
public static void SerializeCompressed(object value, Stream stream, JsonSerializerSettings settings)
{
using (var compressor = new GZipStream(stream, CompressionMode.Compress))
using (var writer = new StreamWriter(compressor, Encoding.UTF8, BufferSize))
{
var serializer = JsonSerializer.CreateDefault(settings);
serializer.Serialize(writer, value);
}
}
public static T DeserializeFromFileCompressed<T>(string path, JsonSerializerSettings settings = null)
{
using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
return DeserializeCompressed<T>(fs, settings);
}
public static T DeserializeCompressed<T>(Stream stream, JsonSerializerSettings settings = null)
{
using (var compressor = new GZipStream(stream, CompressionMode.Decompress))
using (var reader = new StreamReader(compressor))
using (var jsonReader = new JsonTextReader(reader))
{
var serializer = JsonSerializer.CreateDefault(settings);
return serializer.Deserialize<T>(jsonReader);
}
}
}
Run Code Online (Sandbox Code Playgroud)
请参阅Json.NET文档中的性能提示:优化内存使用情况.
| 归档时间: |
|
| 查看次数: |
2204 次 |
| 最近记录: |