如何从定义不再在代码库中的序列化对象读取数据?

| 说我有以下课程:
[Serializable]
public class A
{
    public string B { get; set; }
}
并使用以下方法对其进行序列化:
public void Serialize()
{
    BinaryFormatter b = new BinaryFormatter();
    b.Serialize(new FileStream(@\"C:\\Temp\\out.dat\", FileMode.Create), new A());
}
如果在某个时候,有人来修改类定义以包含一个额外的属性(或删除一个属性):
[Serializable]
public class A // Same class
{
    public string B { get; set; }
    public string C { get; set; } // New property
}
那么以下内容将中断:
public void Deserialize()
{
    BinaryFormatter b = new BinaryFormatter();
    A deserialized = (A)b.Deserialize(new FileStream(@\"C:\\Temp\\out.dat\", FileMode.Open));
}
因为该类的序列化版本与新类的类定义不匹配。 我真的不喜欢序列化作为一种​​持久性机制的想法,因为它是如此脆弱。如果我参与了这项决定,我会早些处理。 有什么方法可以将序列化的数据转换成我可以读取的形式,而无需将所有当前类定义都恢复为序列化状态? 即使它“极力”,我也希望能做到这一点,因为我希望只做一次(或者直到我弄清楚如何解决问题的根源)。 编辑 这些类中有许多已经被序列化,然后已经在我的系统中进行了修改。使用版本控制来准确查看每个类的更改时间和方式是不可行的。 我目前正在尝试找出一种方法,可以在用户尝试将对象反序列化为“新A \”格式之前保留“旧A \”的设置,而我必须1)试试,2 )捕获,3)吞下错误,最后4)使用默认值(基于新对象定义)重新创建A。     
已邀请:
        我相信您可以使用
OptionalFieldAttribute
(System.Runtime.Serialization命名空间)来装饰新添加的成员,这将允许您反序列化添加该成员之前已序列化的实例。
[Serializable]
public class A // Same class
{
    public string B { get; set; }
    [OptionalField] public string C { get; set; } // New property
}
    

要回复问题请先登录注册