【问题标题】:Does BinaryFormatter apply any compression?BinaryFormatter 是否应用任何压缩?
【发布时间】:2010-11-23 10:23:27
【问题描述】:

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

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

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

【问题讨论】:

  • 基元愉快地重复着令人作呕,唯一发生的“压缩”是不间断的空序列(例如在数组中)被存储为代表序列中数字的字节或整数。字符串(通常)不重复,类定义不重复,多个对象引用不会导致对象被多次序列化/输出。

标签: c# .net serialization compression binaryformatter


【解决方案1】:

不,它没有,但是...

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多