如何反序列化已经改变了旧类型的数据?
-
12-09-2019 - |
题
我已经使用二进制序列为下面的类存储的数据:
[Serializable]
public abstract class BaseBusinessObject
{
private NameValueCollection _fieldErrors = new NameValueCollection();
protected virtual NameValueCollection FieldErrors
{
get { return _fieldErrors; }
set { _fieldErrors = value; }
}
...
}
在某些点,类改变为这样:
[Serializable]
public abstract class BaseBusinessObject
{
private Dictionary<string, string> _fieldErrors = new Dictionary<string, string>();
protected virtual Dictionary<string, string> FieldErrors
{
get { return _fieldErrors; }
set { _fieldErrors = value; }
}
...
}
这导致反序列化旧数据的问题。
我首先想到的是要落实ISerializable
,但这个类有许多性能以及数百继承类的,我将不得不实施本作也。
我想要么改变旧的数据反序列化过程在当前结构匹配或有升级旧数据的清洁方式。
解决方案
添加新_fieldErrors
根据不同的名称,说_fieldErrors2
,并使它的 [Optional]
。然后实施 [OnDeserialized]
的方法复制从_fieldErrors
数据到_fieldErrors2
(如果存在的话),并清除_fieldErrors。
其他提示
如果数据仅供内部使用,我首先想到的是写一些简单的扔掉的代码以反序列化的二进制数据使用旧“的NameValueCollection”,它映射到Dictionnary和重新序列化。即使它会需要几天时间来处理所有的数据,它似乎并不值得实现你的新代码补丁,以支持旧的数据。
即使它不仅在内部使用,进口商似乎喜欢去的最简单方法。
添加到OlivierD的很好的意见,我建议您同时定义了类,但最初尝试反序列化作为当前版本。在你的catch块,反序列化的旧版本,然后将其升级到当前的一个,并将其保存回。当不存在的旧版本的情况下,可以删除该代码。
调查几个选项之后,我提出了以下结论:
理想我将能够从原始NameValueCollection
访问该值并手动将其转换为Dictionary<string, string>
。要做到这一点的唯一方法是执行ISerializable
,但提出了两个主要问题:匹配到遗留数据的命名和所有继承类(其中有数百个)列入序列化逻辑。
实际上,这使我处于困境。幸运的是,我能够确定这一领域实际上只是作为表单验证错误的摘要,不应该摆在首位得到连载,所以我从系列化排除它。