2009-09-23 12 views
7

Si tengo una clase llamada "MyClass" en un ensamblado llamado "AssemblyA" y la serializo en un archivo usando .NET's BinaryFormatter. A continuación, mueva el código de "MyClass" en un conjunto llamado "AssemblyB" e intentar deserializar el archivo me sale el siguiente "System.TypeLoadException" excepción:C# Deserializar una clase que se ha movido o cambiado de nombre

No se pudo cargar el tipo 'AssemblyA.MyClass' del ensamblado ' AssemblyA, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null '.

¿Hay alguna manera de indicar que la clase se ha movido a AssemblyB? A través de un atributo de algún tipo? ¿O es posible modificar el archivo serializado como un paso previo al preprocesamiento para cambiar todas las referencias de AssemblyA.MyClass a AssemblyB.MyClass? Finalmente, si ninguna de esas opciones es posible, ¿es posible eludir intentar deserializar esta clase y continuar deserializando el resto de los datos de todos modos?

Respuesta

6

Si lo ha movido, a continuación, añadir una referencia a la DLL donde reside actualmente, y el uso TypeForwardedToAttribute:

[assembly:TypeForwardedTo(typeof(TheType))] 

Esto será suficiente para algunas peticiones (incluyendo BinaryFormatter IIRC) en busca de un tipo de encuéntralo en la nueva asamblea. Sin embargo, IIRC solo funciona para los tipos más externos (no anidados, y probablemente no genéricos), y no puede haberlo cambiado/cambiado el espacio de nombres/etc.

Renombrar es tricker ... BinaryFormatter es notoriamente frágil tales cosas. IMO, solo es adecuado para serializar datos transitorios entre dos sistemas estrechamente acoplados (por ejemplo, el intercambio entre dos AppDomain s en el mismo proceso; cuando se usa para almacenamiento, o entre sistemas que pueden perder sincronía, puede ser una pesadilla.

puede ser demasiado tarde, pero yo recomendaría el uso de un serializador basado en un contrato (en lugar de un serializador basado en el tipo); cualquiera de XmlSerializer, DataContractSerializer (siempre y cuando se utiliza el [DataContract]/[DataMember] atributos), etc. De si quieres un binario rápido, protobuf-net haría un buen trabajo (y puede enganchar en ISerializable si es necesario).

Otro concepto que podría valer la pena mirar es la sustitución de la serialización, pero tha t es relativamente duro. Pero IIRC le da el control sobre el tipo que se crea, pero necesita hacer un lote del trabajo para él.

Cuestiones relacionadas