我正在尝试BinaryFormatter
跨不同版本的程序集进行工作。我要反序列化的实际类在每个程序集版本中完全相同,但是在反序列化时,因为对象被序列化包括它们来自的程序集名称,所以BinaryFormatter
抱怨它找不到正确的程序集。所以我创建了一个自定义SerializationBinder
,告诉BinaryFormatter
总是反序列化到当前的程序集版本。
我的方案可以正常工作并且可以正确反序列化对象,但如果我的对象是 T 的列表,则它不起作用,其中 T 是从我的程序集的旧版本序列化的类型。
有什么方法可以使它与列表和其他泛型类型一起工作,其中类型参数是我的程序集中的一个类?
//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);
}