Я пытаюсь сделать работу 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);
}