Двойная десериализация с другой версией сборки
У меня есть проект, который использует BinaryFormatter для сериализации коллекции структур со строкой и bool? типы данных.
Сериализация/десериализация работает отлично, однако, если я должен был сменить сборку, которая не позволяет выполнить работу, из-за заголовка в двоичном файле, указывающего, что для обработки данных требуется Assembly x
вместо Assembly y
.
Можно ли настроить сериализацию/десериализацию как агностическую сборку?
Ответы
Ответ 1
Вы можете управлять тем, как бинарный форматтер разрешает свои типы, назначая пользовательский SerializationBinder для форматирования. Таким образом, вам не нужно возиться с событиями разрешения AppDomain, и вы устраняете риск неожиданных побочных эффектов от этого.
Подробный пример приведен в MSDN.
Ответ 2
Вы можете изменить свойство BinaryFormatter AssemblyFormat, чтобы сделать сериализацию независимой от версии сборки.
// Example
var binFormat = new BinaryFormatter();
binFormat.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;
Ответ 3
Подключиться к событию 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
Ответ 4
Существуют альтернативные (двоичные) механизмы сериализации (как это), которые не зависят от сборки.
Ответ 5
GAC - ваш первый ресурс, позволяющий различным версиям сборки сосуществовать бок о бок. Но это действительно ничего не решает, если ваше приложение также не поддерживает версию. Двоичная сериализация имеет несколько функций для обработки толерантной сериализации версий. Читайте об этом в этой статье MSDN статьи в библиотеке.