Бинарная десериализация с другой версией сборки
У меня есть проект, который использует 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.