SerializationBinder со списком

Я пытаюсь заставить 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);
}
10
задан dan 26 April 2011 в 19:35
поделиться