如何从定义为';t在我的代码库中

本文关键字:我的 代码 定义 | 更新日期: 2023-09-27 17:59:25

假设我有以下类:

[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。

如何从定义为';t在我的代码库中

我相信您可以使用OptionalFieldAttribute(System.Runtime.Serialization命名空间)装饰新添加的成员,这将允许您反序列化在添加该成员之前序列化的实例。

[Serializable]
public class A // Same class
{
    public string B { get; set; }
    [OptionalField] public string C { get; set; } // New property
}