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

C# 当从自动实现的属性切换时,如何保持可序列化类向后兼容,c#,serialization,C#,Serialization,我有一门课是这样的: [Serializable] public class MyClass { public Dictionary<string, int> MyProperty { get; set; } } [可序列化] 公共类MyClass { 公共字典MyProperty{get;set;} } 我需要更改MyProperty,使其不再自动实现。我的问题是,这会破坏兼容性吗?换句话说,在这次更改之前序列化的MyClass实例在这次更改之后会被正确地反序列化吗?我

我有一门课是这样的:

[Serializable]
public class MyClass
{
    public Dictionary<string, int> MyProperty { get; set; }
}
[可序列化]
公共类MyClass
{
公共字典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; }
    }
}
[可序列化]
公共类MyClass
{
私人字典(myProperty);;
公共字典MyProperty
{
获取{返回此。\u myProperty;}
设置{Validate(value);this.\u myProperty=value;}
}
}
编辑:我尝试了这个特定的玩具示例,它似乎很有效,但这并没有给我多少信心,因为我的真实示例更复杂。我想了解基本规则,以便在测试之前进行有根据的猜测。

您可以使用以旧名称提取字段的值


或者,将此自动属性设置为虚拟并从中派生一个类。这样,您就可以使用
base.MyProperty
访问自动命名备份字段。您可以在派生类中有一个新字段,最好使用它。

为什么不自己检查它?@Dmitry:检查我的编辑是的,这是一个突破性的更改。二进制序列化只知道字段,不关心属性。您的原始字段有一个无法说出的名称,
MyClass::k_ubackingfield
。它不再是了。@HansPassant有什么办法可以避免这种情况吗?例如。使用属性或其他东西来定制序列化?另外,如果这是破坏性的,那么为什么它在上面的情况下工作呢?只需保留类的原始版本即可。让自己有点痛苦的是,新与旧将如何互动,extern alias是一个交给您的工具。普遍的问题是,版本控制很难,没有人会帮你把“糟糕的旧版本”和“出色的新方法”的区别写出来。