2010-11-16 8 views
18

Estoy usando BinaryFormatter para serializar una matriz de instancias de clases en un archivo. Puedo deserializar esta multa dentro de la misma aplicación. Cuando trato de la misma deserialización en una aplicación diferente (que tira en un fichero común que hace el trabajo), entonces me sale el siguiente error:Cómo hacer que BinaryFormatter se deserialice en una aplicación diferente

{"Could not load file or assembly 'pmlscan, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The module was expected to contain an assembly manifest."} 

donde pmlscan es el nombre de la aplicación original. ¿Cómo hago para que BinaryFormatter no intente y cargue pmlscan?

Respuesta

0

¡No puede!

La mejor opción es publicar sus clases serializables en un ensamblaje separado y hacer referencia a ello en el servidor (serializador) y el cliente (deserializador). De esta forma, no está publicando todo su código fuente en el mundo exterior.

+3

Usted está hablando de .Net aquí. Todo es posible. (Aunque el ensamblaje por separado es el más fácil). – GvS

+0

El problema no es intentar cargar y fallar. La pregunta es "no intentar y cargar pmlscan". – Aliostad

+0

Usando assemblyRedirect no intente cargar pmlscan. Pero decir "¡No puedes!", Eso no es correcto. Dado que este es un asunto complejo, te perdono y no te lo perdoné ;-) – GvS

3

El serializador binario codifica información de clase y ensamblaje en una matriz binaria. Cuando deserializa este conjunto, el deserializador utiliza esta información para ubicar el ensamblaje en el que reside la clase y (si es necesario) carga el ensamblado en el dominio de la aplicación. Si la otra aplicación no tiene acceso al ensamblaje en el que reside el tipo de clase, verá el error que está recibiendo.

Como se menciona en otro cartel, coloque estas clases comunes en un ensamblado compartido y despliéguelas en el cliente/otra aplicación, así como en la aplicación del servidor.

+0

Mi +1, señor ... – Aliostad

+2

Bueno, siempre puede resolver a otro ensamblaje y tipo compatible para la deserialización. Eso funciona, pero no para los débiles de corazón. – leppie

2

Si las clases son las mismas, y es simplemente otro ensamblaje, puede intentar agregar una sección assemblyBinding a su archivo .config.

También debería leer el artículo sobre Resolving Assembly Loads y TypeResolve event.

Usando estas técnicas puede redirigir el sistema de tipos .Net a otro tipo mientras se deserializa.

Nota: La migración de sus clases compartidas a un .dll compartido será una solución más fácil.

1
sealed class PreMergeToMergedDeserializationBinder : SerializationBinder 
{ 
    public override Type BindToType(string assemblyName, string typeName) 
    { 
     return Type.GetType("BinarySerialization.YourClass"); 
    } 
} 
BinaryFormatter bfDeserialize = new BinaryFormatter(); 
bfDeserialize.Binder = new PreMergeToMergedDeserializationBinder(); 
while (fsRead.Position < fsRead.Length) 
{ 
    YourClass sibla = (YourClass)bfDeserialize.Deserialize(fsRead); 
} 

Asumiendo que tiene un exe que serializa los datos en su "YourClass" y un otro exe que des-serializa los objetos YourClass.

Cuestiones relacionadas