usan que proyectos programas hechos hechas famosos empresas ejemplos aplicaciones c# .net serialization binaryformatter

c# - proyectos - Cómo hacer que BinaryFormatter deserialice en una aplicación diferente



programas famosos hechos en c# (5)

¡No se puede!

La mejor opción es publicar sus clases serializables en un ensamblaje separado y referirse a ellas en el servidor (serializador) y el cliente (deserializador). De esta manera, no está publicando la totalidad de su código fuente en el mundo exterior.

Estoy utilizando BinaryFormatter para serializar una matriz de instancias de clase en un archivo. Puedo deserializar esta multa dentro de la misma aplicación. Cuando intento la misma deserialización en una aplicación diferente (que extrae un archivo común que hace el trabajo), aparece el siguiente error:

{"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 consigo que BinaryFormatter no intente cargar pmlscan?


El serializador binario codifica la información de clase y ensamblaje en una matriz binaria. Cuando deserializa esta matriz, el deserializador usa esta información para ubicar el conjunto en el que reside la clase y (si es necesario) carga el conjunto en su dominio de 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 lo mencionó otro póster, coloque estas clases comunes en un ensamblaje compartido y desplácelas en el cliente / otra aplicación, así como en la aplicación del servidor.



Si las clases son las mismas, y es solo otro conjunto, puede intentar agregar una sección de enlace de assemblyBinding a su archivo .config.

También debe leer el artículo sobre Resolver cargas de ensamblajes y el evento TypeResolve .

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

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


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

Suponiendo que tiene un exe que serializa los datos en su "YourClass" y otro exe que serializa los objetos de YourClass.