我试图让 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);
}
最佳答案
如果您从版本 1.0.0.0 程序集中序列化 List< MyClass > 的实例,将要求 SerializationBinder.BindToType 函数提供此类型:
System.Collections.Generic.List`1[[MyAssembly.MyClass, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=12345678901234567890]]
为了将 List< MyClass > 类型重新映射到您的 2.0.0.0 版程序集,您需要将类型名称更改为:
System.Collections.Generic.List`1[[MyAssembly.MyClass, MyAssembly]]
要注意的要点是程序集名称不是完全限定的。如果您尝试使用 2.0.0.0 版本号完全限定程序集名称,它将不起作用。
关于c# - 带有 List<T> 的 SerializationBinder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5794686/