代码之家  ›  专栏  ›  技术社区  ›  Reto Meier

BinaryFormatter是否应用任何压缩?

  •  7
  • Reto Meier  · 技术社区  · 15 年前

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

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

    编辑 -等等,如果字符串被放在.NET中,就不必担心重复的字符串了,对吧?

    2 回复  |  直到 13 年前
        1
  •  10
  •   Community CDub    7 年前

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

    编辑: Mehrdad 在他回答 How to compress a .net object instance using gzip .

    编辑2: 可以 被拘留,但这并不意味着每一根绳子 实习的我不会对clr如何或为什么决定使用intern字符串做任何假设,因为它可以从一个版本更改(并且已经更改)到另一个版本。

        2
  •  5
  •   Daniel MoÅ¡mondor    13 年前

    不,不是,但是…

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