Estoy tratando de hacer que el BinaryFormatter
funcione en diferentes versiones de mi ensamblaje. La clase real a la que quiero deserializar es exactamente la misma en cada versión de ensamblaje, pero en la deserialización, debido a que los objetos están serializados incluyen el nombre del ensamblaje del que provienen, el BinaryFormatter
se queja de que no puede encontrar el ensamblaje correcto. Así que creé un SerializationBinder
personalizado que le dice al BinaryFormatter
que siempre se deserialice a la versión de ensamblaje actual.SerializationBinder con la lista <T>
Mi esquema funciona y puede deserializar objetos correctamente, pero no funciona si mi objeto es una Lista de T, donde T era un tipo serializado de una versión anterior de mi ensamblaje.
¿Hay alguna manera de hacer que esto funcione con listas y otros tipos genéricos donde el parámetro tipo es una clase de mi ensamblado?
//the object i want to deserialize
class MyObject
{
public string Name{get;set;}
}
//my binder class
class MyBinder : SerializationBinder
{
static string assemblyToUse = typeof (MyObject).Assembly.FullName;
public override Type BindToType(string assemblyName, string typeName)
{
var isMyAssembly = assemblyName.StartsWith("oldAssemblyName");
var assemblyNameToUse = isMyAssembly ? assemblyToUse : assemblyName;
var tn = typeName + ", " + assemblyNameToUse;
return Type.GetType(tn);
}
}
//my deserialize method
static object BinaryDeserialize(string input)
{
var arr = Convert.FromBase64String(input);
var ms = new MemoryStream(arr);
ms.Seek(0, SeekOrigin.Begin);
var bf = new BinaryFormatter();
bf.Binder = new MyBinder();
var obj = bf.Deserialize(ms);
return obj;
}
static void Test()
{
//this works
//serialized(new MyObject());
var str = ReadSerialized_MyObject();
var obj = BinaryDeserialize(str);
//this doesn't work
//serialized(new List<MyObject>());
var str2 = ReadSerialized_List_of_MyObject();
var obj = BinaryDeserialize(str2);
}
esto es lo que terminé haciendo ... apunta a que ya me olvidé de responder a esta misma – dan
Esto sólo podría salvar mi vida Enviar esta lista de más de 1000 es de aproximadamente 3 MB de tamaño de mensaje una vez SOAPified utilizando un punto final de un servicio básico WCttBinding. Ahora que estoy codificando binariamente el mensaje a mano, tengo alrededor de .4MB. Eres un salvavidas! – Aejay