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