Binary Deserialization com a versão de montagem diferente
-
21-08-2019 - |
Pergunta
Eu tenho um projeto que usa BinaryFormatter para serializar uma coleção de estruturas com corda e bool? tipos de dados.
A serialização / desserialização funciona bem, no entanto, se eu fosse para mudar o conjunto que faz o trabalho deixa de desserializar por causa do cabeçalho no arquivo binário indicando que ele requer Assembly x
vez de Assembly y
para lidar com os dados.
É possível configurar a serialização / desserialização ser montagem agnóstico?
Solução
Você pode controlar como o formatador binário resolve seus tipos, atribuindo um SerializationBinder personalizado para o formatador. Desta forma, você não vai precisar mexer com eventos determinação da AppDomain e você eliminar o risco de efeitos colaterais inesperados a partir daí.
Há um exemplo detalhado em MSDN .
Outras dicas
Você pode mudar sua BinaryFormatter propriedade AssemblyFormat fazer serialização independente da versão do assembly.
// Example
var binFormat = new BinaryFormatter();
binFormat.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;
ligar para o evento AppDomain.OnAssemblyResolve e fixar-se os nomes de montagem
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 );
}
}
}
Fonte: http://osdir.com/ ml / windows.devel.dotnet.clr / 2003-12 / msg00441.html
Existem altenative (binário) motores de serialização ( como este ) que aren 't assembly dependente.
O GAC é o seu primeiro recurso, permitindo que diferentes versões do side-by-the montagem para co-existir. Mas isso não resolve realmente nada a menos que seu aplicativo é a versão tolerante demais. serialização binária tem várias características para serialização alça versão tolerante. Leia mais sobre isso neste MSDN artigo biblioteca .