2009-02-03 10 views
24

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

La serialización/deserialización funciona bien, sin embargo, si tuviera que cambiar el conjunto que hace el trabajo que no puede deserializar a causa de la cabecera en el archivo binario que indica que se requiere Assembly x en lugar de Assembly y para manejar los datos.

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

+0

Estoy teniendo el mismo problema ... me alegra saber que ha sido abordado. – mmr

Respuesta

19

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.

+0

Gracias, esta parece ser la opción más segura, especialmente si muevo el código a un ensamblaje diferente ... –

+0

excepto que no funciona (al menos para mí ...) – mmr

+0

@mmr: Acabo de probarlo y obtuve está funcionando. Comience con el ejemplo de MSDN en la respuesta y modifique el encuadernador de serialización para permitir que la versión de ensamblaje no coincida. – SteinNorheim

5

Hook en el evento AppDomain.OnAssemblyResolve y de corrección de los nombres de montaje

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

+0

Originalmente iba a usar esto, sin embargo, puedo ver que hay posibles casos de fallas en la ejecución simultánea. –

1

El GAC es su primer recurso, lo que permite diferentes versiones del conjunto de coexistir lado -al lado. 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 MSDN library article.

+0

Gracias por la sugerencia del GAC, sin embargo, estoy tratando de no dejar una gran huella con la aplicación, tener todo ejecutar desde su propia carpeta. –

3

Existen motores de serialización altenativos (binarios) (like this) que no dependen del ensamblaje.

+0

Buena ventaja, gracias por todo el trabajo duro en esto. – InteXX

11

Puede cambiar su propiedad BinaryFormatter AssemblyFormat para 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; 
+0

Funciona, pero los datos deben ser serializados y deserializados utilizando el mismo método. – dariol

+0

+1 esto funciona y es la solución más simple que puedo ver – earcam

Cuestiones relacionadas