代码之家  ›  专栏  ›  技术社区  ›  David

BinaryFormatter忽略程序集版本

  •  5
  • David  · 技术社区  · 13 年前

    我有以下方法来生成对象的哈希。效果很好!但是,当我更改程序集的版本时,即使对象相同,哈希也会发生变化。

    public static string GetHash(Object item)
    {
        MemoryStream memoryStream = new MemoryStream();
        BinaryFormatter binaryFormatter = new BinaryFormatter();
        binaryFormatter.Serialize(memoryStream, item);
        binaryFormatter.AssemblyFormat = FormatterAssemblyStyle.Simple;
    
        HashAlgorithm hashAlgorithm = new MD5CryptoServiceProvider();
        memoryStream.Seek(0, SeekOrigin.Begin);
    
        return Convert.ToBase64String(hashAlgorithm.ComputeHash(memoryStream));
    }
    

    如何可以忽略程序集版本?

    2 回复  |  直到 13 年前
        1
  •  4
  •   Marc Gravell    13 年前

    但是,当我更改程序集的版本时,即使对象相同,哈希也会发生变化。

    是的,这是使用时的预期行为 BinaryFormatter …它不能保证创建相同的输出-并且 尤其地 由于它包含完整的类型信息(包括版本),所以几乎可以保证在不同版本之间进行更改。

    我会考虑使用一个不包含类型信息的序列化程序; XmlSerializer ,Json.NET或protobuf-NET会跃然纸上。

        2
  •  3
  •   Jon Skeet    13 年前

    BinaryFormatter.AssemblyFormat 记录为:

    获取或设置反序列化程序在查找和加载程序集方面的行为。

    没有迹象表明它对 序列化 路径

    就我个人而言,我会避免这种哈希方法——看起来 非常 对我来说很脆弱。你对被哈希的对象没有控制权,或者有任何更稳定的哈希方式吗?