【问题标题】:BinaryFormatter ignore assembly versionBinaryFormatter 忽略程序集版本
【发布时间】:2013-10-10 07:45:39
【问题描述】:

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

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));
}

怎么可能忽略汇编版本?

【问题讨论】:

  • 对象相同。 .NET 中的类型不仅仅是命名空间和类型名称,它还包括它来自的程序集。其中包括 [AssemblyVersion]。强大的 DLL-Hell 对策。以及防止反序列化不再与更改的类匹配的数据的强大检查。您的哈希计算只是添加 另一个 检查数据是否已更改,可能是不必要的。不,您不能忽略程序集版本。

标签: c# serialization .net-assembly binaryformatter


【解决方案1】:

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

是的,这是使用 BinaryFormatter 时的预期行为...它不保证创建相同的输出 - 尤其是,因为它包含完整的类型信息(包括版本)保证版本之间会发生变化。

我会考虑使用不包含类型信息的序列化程序; XmlSerializer,Json.NET 或 protobuf-net 会浮现在脑海中。

【讨论】:

    【解决方案2】:

    BinaryFormatter.AssemblyFormat 记录为:

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

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

    就我个人而言,我会避免这种散列方法 - 这对我来说似乎非常脆弱。您是否无法控制被散列的对象,或者任何更稳定的散列方式?

    【讨论】:

      猜你喜欢
      • 2016-02-03
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      • 2010-11-05
      • 1970-01-01
      相关资源
      最近更新 更多