Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将BinaryFormatter结果反序列化为其他类型_C# - Fatal编程技术网

C# 将BinaryFormatter结果反序列化为其他类型

C# 将BinaryFormatter结果反序列化为其他类型,c#,C#,我们最近重写了系统的架构,在上线的那天遇到了一个相当大的问题 我们通过使用BinaryFormatter序列化表单模型并将结果存储在数据库中,在用户填写表单时保存用户信息: private byte[] Serialize<T>(T model) { try { var formatter = new BinaryFormatter(); using (var stream = new MemoryStream()) {

我们最近重写了系统的架构,在上线的那天遇到了一个相当大的问题

我们通过使用BinaryFormatter序列化表单模型并将结果存储在数据库中,在用户填写表单时保存用户信息:

private byte[] Serialize<T>(T model)
{
    try
    {
        var formatter = new BinaryFormatter();
        using (var stream = new MemoryStream())
        {
            formatter.Serialize(stream, model);
            return stream.ToArray();
        }
    }
    catch (System.Exception ex)
    {
        _log.LogException(ex);
    }

    return null;
}
private byte[]序列化(T模型)
{
尝试
{
var formatter=新的二进制格式化程序();
使用(var stream=new MemoryStream())
{
序列化(流、模型);
返回流ToArray();
}
}
catch(System.Exception-ex)
{
_log.LogException(ex);
}
返回null;
}
当用户再次需要信息时,我们只需将其反序列化为相同的类型,效果非常好:

public  T Deserialize<T>(byte[] serializedData)
{
    try
    {
        var formatter = new BinaryFormatter();
        using (var stream = new MemoryStream(serializedData))
        {
            var result = (T)formatter.Deserialize(stream);
            return result;
        }
    }
    catch (System.Exception ex)
    {
        _log.LogException(ex);
        return default(T);
    }
}
public T反序列化(字节[]序列化数据)
{
尝试
{
var formatter=新的二进制格式化程序();
使用(变量流=新内存流(序列化数据))
{
var result=(T)格式化程序。反序列化(流);
返回结果;
}
}
catch(System.Exception-ex)
{
_log.LogException(ex);
返回默认值(T);
}
}
问题出现在架构重写之后,我们有3个客户端仍然保存了遗留表单数据。更新后的体系结构的表单模型具有相同的属性名称,但在新程序集中显然有新的名称空间

因此,formatter.Deserialize失败,因为它试图反序列化为不在新体系结构中的程序集中的对象


是否有任何可能的方法可以反序列化到通用对象中,然后向新模型中进行深度复制(或者使用automapper或类似的方法)?或者BinaryFormatter与对象紧密绑定,我需要包含用于执行序列化的类型定义的dll才能执行反序列化?

最后一个BinaryFormatter与序列化它的程序集类区域性紧密绑定。环顾四周,您可以找到一种使用自定义SerializationBinder“欺骗”它的方法。有一个速度更快的第三方序列化程序没有这个功能problem@PlutonixSerializationBinder似乎正是我要找的。我需要找出如何区分不同程序集中同一名称空间的多个版本,以及同一程序集中不同名称空间的多个版本,但我认为这就是我需要让它工作的地方。如果你有更多的信息,我将不胜感激。在任何情况下,如果您提供您的回答作为答案,我会将其标记为正确。SerializationBinder只会随着新版本的出现将问题无限传播到未来。ProtoBuf NET是一个数据协定二进制序列化程序,它不受此类约束。SerializationBinder可以在对遗留数据进行反序列化时发挥作用,然后对未来的一切进行PBN。