Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataContractSerializer和枚举问题_C#_Datacontractserializer - Fatal编程技术网

C# DataContractSerializer和枚举问题

C# DataContractSerializer和枚举问题,c#,datacontractserializer,C#,Datacontractserializer,我正在使用DataContractSerializer。我有旧版本的enum,如下所示 [DataContract] public Enum Foo { [EnumMemberAttribute] X, [EnumMemberAttribute] Y, [EnumMemberAttribute] Z } 我几乎没有使用“Z”的文件。现在在最新版本中,我从枚举中删除了“Z”。 但是当我试图在当前代码中使用这些旧文件时,我得到了一个“Z”的例外

我正在使用DataContractSerializer。我有旧版本的enum,如下所示

[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

的已保存数据,提示出现在短语“数据契约”中。你不能随意违反合同。如果你那样做,它将不起作用。现在,有一些灵活性。。。你通常可以对合同进行补充,只要你不关心那些只知道旧合同的人(所以即使这样也值得怀疑)。然而,也许更好的选择是:

[EnumMemberAttribute, Obsolete("Use Y instead", true)]
Z
这将仍然可以
DataContractSerializer
(尽管IIRC
XmlSerializer
不喜欢它),但编译器将停止您在常规代码中使用它


如果完全删除
Z
,则无法再处理提及
Z

+1的任何已保存数据。我看不出OP在“违背承诺”和“糟糕的计划”之外还有什么问题。可悲的是,这里没有真正的解决方案——因为除非Z没有任何意义。。。。那么应该使用什么值呢?Semantical change=不兼容。实际上Z没有意义,但文件中的其他数据仍然有用。所以有点向后兼容。@user1427678是的,我理解保留向后兼容的意图。这意味着不要把你的合同撕碎。
[过时]
机制是一种很好的方法。删除枚举值:不太多。是的,马克,你的建议很好。我会注意进一步的修改。但是在我当前的例子中,Z已经被删除,我无法修改包含foo enum的文件。我想以某种方式打开以前的文件。类似于XmlAttributeOverrides.+1。我看不出OP在“违背承诺”和“糟糕的计划”之外还有什么问题。可悲的是,这里没有真正的解决方案——因为除非Z没有任何意义。。。。那么应该使用什么值呢?Semantical change=不兼容。实际上Z没有意义,但文件中的其他数据仍然有用。所以有点向后兼容。@user1427678是的,我理解保留向后兼容的意图。这意味着不要把你的合同撕碎。
[过时]
机制是一种很好的方法。删除枚举值:不太多。是的,马克,你的建议很好。我会注意进一步的修改。但是在我当前的例子中,Z已经被删除,我无法修改包含foo enum的文件。我想以某种方式打开上一个文件,比如XmlAttributeOverrides。