7

当.NETBinaryFormatter用于序列化对象图时,是否应用了任何类型的压缩?

我问我是否应该担心对象图有许多重复的字符串和整数。

编辑- 等一下,如果字符串是在 .NET 中实习的,就不必担心重复的字符串,对吧?

4

2 回答 2

10

不,它不提供任何压缩,但您可以使用该GZipStream类型自己压缩输出。

编辑: Mehrdad在他对How to compress a .net object instance using gzip的回答中有一个很好的例子。

编辑 2:字符串可以被实习,但这并不意味着每个字符串被实习。我不会对 CLR 如何或为什么决定实习字符串做出任何假设,因为这可能会因版本而异(并且已经更改)。

于 2009-08-27T15:36:38.363 回答
5

不,它没有,但是……

我今天刚刚为我的应用添加了 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,以这种方式链接(解)压缩和(解)加密是很重要的,因为在加密从数据中产生噪音之前,您会希望丢失熵。

于 2011-05-10T13:31:05.127 回答