2009-02-03 3 views
24

У меня есть проект, который использует BinaryFormatter для сериализации коллекции структур со строкой и bool? типы данных.Двоичная десериализация с другой версией сборки

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

Возможно ли установить сериализацию/десериализацию для сборки агностиком?

+0

У меня такая же проблема ... рада узнать, что это было исправлено. – mmr

ответ

19

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

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

+0

Спасибо, это похоже на самый безопасный вариант - особенно если я переведу код в другую сборку ... –

+0

за исключением того, что он не работает (по крайней мере для меня ...) – mmr

+0

@mmr: я только что протестировал его и получил он работает. Начните с примера MSDN в ответе и измените связующее сериализацию, чтобы разрешить несоответствие версии сборки. – SteinNorheim

5

крюк в случае 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

+0

Я изначально собирался использовать это, однако я вижу, что возможны угловые случаи неудачного сбоя при одновременном выполнении. –

1

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

+0

Спасибо за предложение GAC, однако я стараюсь не оставлять тяжелый след с App, имея все запустить из своей папки. –

3

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

+0

Хорошее руководство, спасибо за всю тяжелую работу над этим. – InteXX

11

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

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

Он работает, но данные должны быть сериализованы и десериализованы с использованием того же метода. – dariol

+0

+1 это работает и является самым простым решением, которое я вижу – earcam