Бинарная десериализация с другой версией сборки - PullRequest
26 голосов
/ 03 февраля 2009

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

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

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

Ответы [ 5 ]

22 голосов
/ 03 февраля 2009

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

Подробный пример: MSDN .

12 голосов
/ 12 октября 2010

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

// Example
var binFormat = new BinaryFormatter();
binFormat.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;
5 голосов
/ 03 февраля 2009

Подключитесь к событию 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

3 голосов
/ 03 февраля 2009

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

1 голос
/ 03 февраля 2009

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

...