2013-10-10 5 views
3

У меня есть следующий способ генерации хэша объекта. Он работает очень хорошо! Но когда я меняю версию сборки, хэш меняется, даже когда объект тот же.BinaryFormatter ignore assembly version

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

Как можно игнорировать версию сборки?

+1

Объект * не * одинаковый. Тип в .NET - это не просто имя пространства имен и имя типа, оно также включает в себя сборку, из которой он пришел. Который включает [AssemblyVersion]. Сильная контрмера DLL-Hell. И сильная проверка, которая предотвращает десериализацию данных, которые больше не соответствуют измененному классу. Ваш хэш-расчет просто добавляет * другой * проверяет, что данные изменились, возможно, излишне. Нет, вы не можете игнорировать версию сборки. –

ответ

2

Но когда я меняю версию сборки, хэш меняется, даже когда объект тот же.

да, то ожидаемое поведение при использовании BinaryFormatter ... это не гарантирует, чтобы создать тот же результат - и особенно, поскольку она включает в себя полную информацию о типе (включая версию) она в значительной степени гарантируется между изменением версии.

Я хотел бы использовать сериализатор, который не включает информацию о типе; XmlSerializer, Json.NET или protobuf-net вскочили бы на ум.

3

BinaryFormatter.AssemblyFormat документирована как:

Получает или задает поведение десериализатор с относительно поиска и загрузки сборок.

Там нет никаких признаков того, что она оказывает влияние на сериализации пути.

Лично я бы избегал этого метода хеширования - кажется ужасно хрупкий для меня. У вас нет контроля над хэшированием объекта или любым способом хэширования более стабильным образом?

 Смежные вопросы

  • Нет связанных вопросов^_^