C# 如何为已更改的类型反序列化旧数据?

C# 如何为已更改的类型反序列化旧数据?,c#,serialization,binary-serialization,C#,Serialization,Binary Serialization,我使用二进制序列化存储了以下类的数据: [Serializable] public abstract class BaseBusinessObject { private NameValueCollection _fieldErrors = new NameValueCollection(); protected virtual NameValueCollection FieldErrors { get { return _fieldErrors; }

我使用二进制序列化存储了以下类的数据:

[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; }
    }

    ...
}
[可序列化]
公共抽象类BaseBusinessObject
{
专用词典_fieldErrors=新词典();
受保护的虚拟字典字段错误
{
获取{return\u fieldErrors;}
设置{u fieldErrors=value;}
}
...
}
这会导致反序列化旧数据时出现问题

我的第一个想法是实现
ISerializable
,但是这个类有许多属性以及数百个继承类,我也必须实现它们


我想在反序列化过程中更改旧数据以匹配当前结构,或者使用干净的方法升级旧数据。

如果数据仅在内部使用,我的第一个想法是编写一些简单的一次性代码,使用旧的“NameValueCollection”反序列化二进制数据,将其映射到词典并重新序列化。即使处理所有数据需要几天时间,在新代码上实现补丁以支持旧数据似乎也不值得


即使它不仅在内部使用,导入器似乎是最简单的方法。

除了OlivierD的好建议之外,我建议您定义这两个类,但最初尝试反序列化为当前版本。在catch块中,将其反序列化为旧版本,然后将其升级到当前版本并将其保存回去。当旧版本的实例不存在时,您可以删除代码。

在另一个名称下添加新的fieldErrors,例如
\u fieldErrors 2
,并使其生效。然后执行一种方法,将数据从
\u fieldErrors
复制到
\u fieldErrors 2
(如果存在),并清除\u fieldErrors。

在调查了几个选项后,我得出以下结论:

理想情况下,我能够从原始的
NameValueCollection
中访问该值,并手动将其转换为
字典
。实现这一点的唯一方法是实现
ISerializable
,但这带来了两个主要问题:匹配遗留数据的命名,以及为所有继承类(其中有数百个)包含序列化逻辑


实际上,这让我陷入了困境。幸运的是,我能够确定该字段实际上仅用作表单验证错误的摘要,不应该首先序列化,因此我将其从序列化中排除。

这为我的需要提供了最现实的方法,但我最终选择了另一条路。