C# DataContractSerializer和枚举问题
我正在使用DataContractSerializer。我有旧版本的enum,如下所示C# DataContractSerializer和枚举问题,c#,datacontractserializer,C#,Datacontractserializer,我正在使用DataContractSerializer。我有旧版本的enum,如下所示 [DataContract] public Enum Foo { [EnumMemberAttribute] X, [EnumMemberAttribute] Y, [EnumMemberAttribute] Z } 我几乎没有使用“Z”的文件。现在在最新版本中,我从枚举中删除了“Z”。 但是当我试图在当前代码中使用这些旧文件时,我得到了一个“Z”的例外
[DataContract]
public Enum Foo
{
[EnumMemberAttribute]
X,
[EnumMemberAttribute]
Y,
[EnumMemberAttribute]
Z
}
我几乎没有使用“Z”的文件。现在在最新版本中,我从枚举中删除了“Z”。
但是当我试图在当前代码中使用这些旧文件时,我得到了一个“Z”的例外
对于XmlSerializer,我们可以通过使用XmlAttributeOverrides来避免这个问题。但对于DataContractSerializer,我们不知道如何处理这种情况
请帮我整理一下。线索在短语“数据合同”中。你不能随意违反合同。如果你那样做,它将不起作用。现在,有一些灵活性。。。你通常可以对合同进行补充,只要你不关心那些只知道旧合同的人(所以即使这样也值得怀疑)。然而,也许更好的选择是:
[EnumMemberAttribute, Obsolete("Use Y instead", true)]
Z
这将仍然可以DataContractSerializer
(尽管IIRCXmlSerializer
不喜欢它),但编译器将停止您在常规代码中使用它
如果您完全删除了Z
,您将无法再处理任何提及Z
的已保存数据,提示出现在短语“数据契约”中。你不能随意违反合同。如果你那样做,它将不起作用。现在,有一些灵活性。。。你通常可以对合同进行补充,只要你不关心那些只知道旧合同的人(所以即使这样也值得怀疑)。然而,也许更好的选择是:
[EnumMemberAttribute, Obsolete("Use Y instead", true)]
Z
这将仍然可以DataContractSerializer
(尽管IIRCXmlSerializer
不喜欢它),但编译器将停止您在常规代码中使用它
如果完全删除
Z
,则无法再处理提及Z
+1的任何已保存数据。我看不出OP在“违背承诺”和“糟糕的计划”之外还有什么问题。可悲的是,这里没有真正的解决方案——因为除非Z没有任何意义。。。。那么应该使用什么值呢?Semantical change=不兼容。实际上Z没有意义,但文件中的其他数据仍然有用。所以有点向后兼容。@user1427678是的,我理解保留向后兼容的意图。这意味着不要把你的合同撕碎。[过时]
机制是一种很好的方法。删除枚举值:不太多。是的,马克,你的建议很好。我会注意进一步的修改。但是在我当前的例子中,Z已经被删除,我无法修改包含foo enum的文件。我想以某种方式打开以前的文件。类似于XmlAttributeOverrides.+1。我看不出OP在“违背承诺”和“糟糕的计划”之外还有什么问题。可悲的是,这里没有真正的解决方案——因为除非Z没有任何意义。。。。那么应该使用什么值呢?Semantical change=不兼容。实际上Z没有意义,但文件中的其他数据仍然有用。所以有点向后兼容。@user1427678是的,我理解保留向后兼容的意图。这意味着不要把你的合同撕碎。[过时]
机制是一种很好的方法。删除枚举值:不太多。是的,马克,你的建议很好。我会注意进一步的修改。但是在我当前的例子中,Z已经被删除,我无法修改包含foo enum的文件。我想以某种方式打开上一个文件,比如XmlAttributeOverrides。