SerializationBinder com a lista <T>
Estou tentando fazer oBinaryFormatter
trabalho em diferentes versões da minha montagem. A classe real que eu quero desserializar é exatamente a mesma em cada versão de montagem, mas na desserialização, porque os objetos são serializados incluem o nome do assembly de onde vieram, oBinaryFormatter
está reclamando que não consegue encontrar a montagem correta. Então eu criei um @ personalizaSerializationBinder
que diz aoBinaryFormatter
para desserializar sempre para a versão atual da montage
Meu esquema funciona e pode desserializar objetos corretamente, mas não funciona se meu objeto for uma Lista de T, onde T era um tipo serializado de uma versão mais antiga do meu assembl
xiste alguma maneira de fazer isso funcionar com Listas e outros tipos genéricos nos quais o parâmetro type é uma classe do meu assembl
//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);
}