c# - 带有 List<T> 的 SerializationBinder

标签 c# .net serialization binaryformatter

我试图让 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/

相关文章:

.net - 在 .NET 中调用 Haskell 函数

.net - 在 IIS 服务器上使用 IndependentStorage

c# - Windows 窗体中的 WPF

c# - Odata Asp.NET WebApi 在实体/DTO 中返回 json 属性

c# - 如何返回具有禁止状态 web api 的 ModelState

c# - 尽管通过代码运行测试,ReSharper dotcover 仍显示 0% 的覆盖率

c# - 内存模型和线程池

php - 来自 PHP 的 Python Pickle 反序列化?

c# - 从代码在存储过程中将数据类型 nvarchar 转换为 datetime 时出错

c# - 可以避免分配 out 值吗?