带有新枚举值的XmlSerializer

sco*_*ott 5 c# xml-serialization

我们在项目中广泛使用xml序列化/反序列化来在多个应用程序之间传递数据.我们有一个共同的xsd,我们生成c#类,然后使用XmlSerializer从xml转到对象并返回.

我们遇到的问题是,当一个应用程序更新为添加新的枚举值但另一个应用程序尚未更新时.现在,未更新的应用程序尝试反序列化xml并失败,因为它不知道新的枚举.

如果我们有app1和app2,那么现场工作正常,那么app2将在xsd中使用新的枚举值进行更新,并在字段中更新到客户端.突然app1中断因为它不知道枚举,app1甚至可能不使用该枚举字段,对app1没有影响,但它仍然会中断.

有没有任何已知的方法.基本上我想要做的是定义当找不到枚举时做什么,使用默认值或者如果枚举为nullible类型并将其设置为null.

XmlSerializer和DataContractSerializer抛出异常都是这种情况.

我查看了自定义xml序列化项目YAXLib(http://www.codeproject.com/KB/XML/yaxlib.aspx),这也引发了异常,但是有源代码并且可以更改.该项目使用不同的属性属性,需要进行相当多的更改,但可能是可行的.

任何其他建议.

Tho*_*que 11

遗憾的是,没有办法控制枚举值的反序列化...作为一种解决方法,您可以将枚举值序列化为字符串:

[XmlIgnore]
public MyEnum MyProperty { get; set; }

[XmlElement("MyProperty")]
public string MyPropertyAsString
{
    get
    {
        return EnumToString(MyProperty);
    }
    set
    {
        MyProperty = StringToEnum<MyEnum>(value);
    }
}

public T StringToEnum<T>(string stringValue)
{
    // Manually convert the string to enum, ignoring unknown values
}

public string EnumToString<T>(T enumValue)
{
    // Convert the enum to a string
}
Run Code Online (Sandbox Code Playgroud)


Sam*_*ens 8

为了将来参考,我认为最好的方法是使用XmlEnumAttribute,它告诉XMLSerializer每个枚举值对序列化和反序列化的名称.

public enum EmployeeStatus
{
   [XmlEnum(Name = "Single")]
   One,
   [XmlEnum(Name = "Double")]
   Two,
   [XmlEnum(Name = "Triple")]
   Three
}
Run Code Online (Sandbox Code Playgroud)

  • 缺少(新)枚举仍然会抛出异常. (2认同)

Aar*_*ers 0

使用 C# 自定义序列化和对象版本控制;这将使您能够处理当一个应用程序更新而另一个应用程序未更新时出现的各种情况