当.NETBinaryFormatter
用于序列化对象图时,是否应用了任何类型的压缩?
我问我是否应该担心对象图有许多重复的字符串和整数。
编辑- 等一下,如果字符串是在 .NET 中实习的,就不必担心重复的字符串,对吧?
当.NETBinaryFormatter
用于序列化对象图时,是否应用了任何类型的压缩?
我问我是否应该担心对象图有许多重复的字符串和整数。
编辑- 等一下,如果字符串是在 .NET 中实习的,就不必担心重复的字符串,对吧?
不,它不提供任何压缩,但您可以使用该GZipStream
类型自己压缩输出。
编辑: Mehrdad在他对How to compress a .net object instance using gzip的回答中有一个很好的例子。
编辑 2:字符串可以被实习,但这并不意味着每个字符串都被实习。我不会对 CLR 如何或为什么决定实习字符串做出任何假设,因为这可能会因版本而异(并且已经更改)。
不,它没有,但是……
我今天刚刚为我的应用添加了 GZipStream 支持,所以我可以在这里分享一些代码;
序列化:
using (Stream s = File.Create(PathName))
{
RijndaelManaged rm = new RijndaelManaged();
rm.Key = CryptoKey;
rm.IV = CryptoIV;
using (CryptoStream cs = new CryptoStream(s, rm.CreateEncryptor(), CryptoStreamMode.Write))
{
using (GZipStream gs = new GZipStream(cs, CompressionMode.Compress))
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(gs, _instance);
}
}
}
反序列化:
using (Stream s = File.OpenRead(PathName))
{
RijndaelManaged rm = new RijndaelManaged();
rm.Key = CryptoKey;
rm.IV = CryptoIV;
using (CryptoStream cs = new CryptoStream(s, rm.CreateDecryptor(), CryptoStreamMode.Read))
{
using (GZipStream gs = new GZipStream(cs, CompressionMode.Decompress))
{
BinaryFormatter bf = new BinaryFormatter();
_instance = (Storage)bf.Deserialize(gs);
}
}
}
注意:如果您使用 CryptoStream,以这种方式链接(解)压缩和(解)加密是很重要的,因为在加密从数据中产生噪音之前,您会希望丢失熵。