当从自动实现的属性切换时,如何保持可序列化的类向后兼容?

本文关键字:序列化 何保持 实现 属性 | 更新日期: 2023-09-27 18:17:57

我有一个这样的类:

[Serializable]
public class MyClass
{
    public Dictionary<string, int> MyProperty { get; set; }
}

我需要改变MyProperty,使其不再自动实现。我的问题是,这会破坏兼容性吗?换句话说,在此更改之前序列化的MyClass实例在此更改之后是否能够正确地反序列化?我需要做些什么来保证这一点吗?是什么规则支配着这一切?

作为参考,我想要这样的:

[Serializable]
public class MyClass
{
    private Dictionary<string, int> _myProperty;
    public Dictionary<string, int> MyProperty
    {
        get { return this._myProperty; }
        set { Validate(value); this._myProperty = value; }
    }
}

编辑:我尝试了这个特定的玩具例子,它似乎工作,但这并没有给我太多的信心,因为我的实际例子(s)更复杂。我想了解潜在的规则,这样我就可以在测试之前做出有根据的猜测。

当从自动实现的属性切换时,如何保持可序列化的类向后兼容?

您可以使用自定义反序列化来提取字段的旧名称的值。

或者,使这个auto属性为虚属性,并从它派生一个类。这样您就可以使用base.MyProperty来访问自动命名的后台字段。您可以在派生类中使用一个新字段。