数据合约序列化程序和枚举问题

本文关键字:枚举 问题 程序 序列化 数据 | 更新日期: 2023-09-27 18:36:20

我正在使用DataContractSerializer。我在旧版本中有枚举,如下所示

[DataContract]
public Enum Foo
{
    [EnumMemberAttribute]
    X,
    [EnumMemberAttribute]
    Y,
    [EnumMemberAttribute]
    Z
}

我有几个使用"Z"的文件。现在在最新版本中,我从枚举中删除了"Z"。但是当我尝试在当前代码上使用旧文件时,我得到了"Z"的异常。

对于 XmlSerializer,我们可以通过使用 XmlAttributeOverrides 来避免此问题。但是对于DataContractSerializer不知道如何处理这种情况。

请帮我整理一下。

数据合约序列化程序和枚举问题

线索在短语"数据契约"中。你不能随意破坏合同。如果你这样做,它将无法工作。现在,有一些灵活性...您通常可以对合同进行补充,只要您不关心只知道旧合同的人(所以即使这样也是可疑的)。但是,也许更好的选择是:

[EnumMemberAttribute, Obsolete("Use Y instead", true)]
Z

仍然适用于DataContractSerializer(尽管IIRC XmlSerializer不喜欢它),但编译器将阻止您在常规代码中使用它。

如果完全删除Z,则无法再处理任何提及Z的已保存数据。