如何从定义不再在代码库中的序列化对象读取数据?
|
说我有以下课程:
[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。
没有找到相关结果
已邀请:
1 个回复
脖呐
(System.Runtime.Serialization命名空间)来装饰新添加的成员,这将允许您反序列化添加该成员之前已序列化的实例。