BinaryFormatter 忽略程序集版本

Dav*_*vid 5 c# serialization binaryformatter .net-assembly

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

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));
}
Run Code Online (Sandbox Code Playgroud)

怎么可能忽略程序集版本?

Mar*_*ell 4

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

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

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