我们最近改写了我们系统的架构,并在我们上线的那天遇到了一个非常大的问题。
我们通过使用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;
}
当用户再次需要这些信息时,我们只需将其反序列化为相同的类型并且效果很好:
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);
}
}
问题出现在架构重写之后,我们有3个客户端仍然保存了传统的表单数据。更新的体系结构的表单模型具有相同的属性名称,但在新程序集中显然是新的名称空间。
因此,formatter.Deserialize失败,因为它正在尝试反序列化到不在新体系结构中的程序集中的对象。
有没有可能的方法我可以以某种方式反序列化为通用对象然后深入复制到新模型(或使用automapper或类似的东西)?或者BinaryFormatter是否与对象紧密相关,我是否需要包含用于进行序列化的类型定义的dll才能进行反序列化?