Бинарная десериализация с другой версией сборки

У меня есть проект, который использует BinaryFormatter для сериализации коллекции структур с помощью строки и bool? типы данных.

Сериализация / десериализация работает нормально, однако, если бы я изменил сборку, которая выполняет работу, она не может десериализоваться из-за заголовка в двоичном файле, указывающего, что он требует Assembly x вместо Assembly y обрабатывать данные.

Можно ли настроить сериализацию / десериализацию так, чтобы она не зависела от сборки?

5 ответов

Решение

Вы можете управлять тем, как двоичный форматировщик разрешает свои типы, назначая собственный форматировщик SerializationBinder. Таким образом, вам не нужно связываться с событиями разрешения AppDomain, и вы исключаете риск непредвиденных побочных эффектов.

Подробный пример есть на MSDN.

Вы можете изменить свойство BinaryFormatter AssemblyFormat, чтобы сделать сериализацию независимой от версии сборки.

// Example
var binFormat = new BinaryFormatter();
binFormat.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;

Подключитесь к событию AppDomain.OnAssemblyResolve и исправьте имена сборок.

private System.Reflection.Assembly OnAssemblyResolve( System.Object sender, System.ResolveEventArgs reArgs )
{
     foreach( System.Reflection.Assembly assembly in System.AppDomain.CurrentDomain.GetAssemblies() ) 
     {
         System.Reflection.AssemblyName assemblyName = assembly.GetName();
         if( assemblyName.FullName == reArgs.Name ) 
         {
              return( assembly );
         }
     }
}

источник: http://osdir.com/ml/windows.devel.dotnet.clr/2003-12/msg00441.html

Существуют альтернативные (двоичные) механизмы сериализации ( подобные этим), которые не зависят от сборки.

GAC - это ваш первый ресурс, позволяющий различным версиям сборки сосуществовать бок о бок. Но это на самом деле ничего не решает, если ваше приложение также не поддерживает версию. Двоичная сериализация имеет несколько функций для обработки толерантной к версии сериализации. Прочитайте об этом в этой статье библиотеки MSDN.

Другие вопросы по тегам