.net serialization binaryformatter assemblyversions

.net - Deserialización binaria con diferentes versiones de montaje



serialization binaryformatter (5)

Tengo un proyecto que utiliza BinaryFormatter para serializar una colección de estructuras con string y bool? tipos de datos.

La serialización / deserialización funciona bien, sin embargo, si tuviera que cambiar el ensamblado que hace el trabajo, no se deserializaría debido al encabezado en el archivo binario que indica que requiere el Assembly x lugar del Assembly y para manejar los datos.

¿Es posible configurar la serialización / deserialización para que sea independiente del ensamblaje?


El GAC es su primer recurso, permitiendo que las diferentes versiones del ensamble coexistan una al lado de la otra. Pero eso no soluciona nada a menos que tu aplicación también sea tolerante a la versión. La serialización binaria tiene varias características para manejar la serialización tolerante a la versión. Lea sobre esto en este artículo de la biblioteca de MSDN.


Enganche en el evento AppDomain.OnAssemblyResolve y arregle los nombres del ensamblado

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 ); } } }

fuente: http://osdir.com/ml/windows.devel.dotnet.clr/2003-12/msg00441.html


Hay motores de serialización altenativos (binarios) ( como este ) que no dependen del ensamblaje.


Puede cambiar su propiedad BinaryFormatter AssemblyFormat para hacer que la serialización sea independiente de la versión de ensamblaje.

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


Puede controlar cómo el formateador binario resuelve sus tipos asignando un SerializationBinder personalizado al formateador. De esta forma, no tendrá que meterse con los eventos de resolución de AppDomain y eliminará el riesgo de efectos secundarios inesperados.

Hay un ejemplo detallado en MSDN .