首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有新枚举值的XmlSerializer

具有新枚举值的XmlSerializer
EN

Stack Overflow用户
提问于 2009-10-26 00:20:13
回答 7查看 17.3K关注 0票数 9

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

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

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

有没有什么办法可以解决这个问题。基本上,我想要做的是定义当找不到枚举时该做什么,使用默认值,或者如果枚举类型为空,则将其设置为null。

XmlSerializer和DataContractSerializer都会在这种情况下抛出异常。

我看过定制的xml序列化项目YAXLib (http://www.codeproject.com/KB/XML/yaxlib.aspx),它也抛出了一个异常,但是有源代码并且可以更改。这个项目使用不同的属性属性,需要相当多的更改,但可能是可行的。

任何其他建议。

EN

回答 7

Stack Overflow用户

发布于 2009-10-26 00:27:02

不幸的是,无法控制枚举值的反序列化方式……作为一种解决方法,您可以将枚举值序列化为字符串:

代码语言:javascript
复制
[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
}
票数 12
EN

Stack Overflow用户

发布于 2013-03-21 17:13:15

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

代码语言:javascript
复制
public enum EmployeeStatus
{
   [XmlEnum(Name = "Single")]
   One,
   [XmlEnum(Name = "Double")]
   Two,
   [XmlEnum(Name = "Triple")]
   Three
}
票数 9
EN

Stack Overflow用户

发布于 2012-02-03 23:18:15

我也一直在努力解决这个问题,我已经找到了使用XmlAttributeOverrides的部分解决方案。根据MS文档:

您可以重写XmlEnumAttribute的Name属性值,方法是创建XmlEnumAttribute类的实例并将其分配给XmlAttributes对象的XmlEnum属性。有关详细信息,请参见XmlAttributeOverrides类。

所以我这样做了:

代码语言:javascript
复制
XmlEnumAttribute enumAttribute = new XmlEnumAttribute();
enumAttribute.Name = "new value";

XmlAttributes attributes = new XmlAttributes();
attributes.XmlEnum = enumAttribute;

XmlAttributeOverrides attributeOverrides = new XmlAttributeOverrides();
attributeOverrides.Add(typeof(EnumType), "OldValue", attributes);

XmlSerializer serializer = new XmlSerializer(typeof(MyType), attributeOverrides);
FileStream fs = new FileStream(filename, FileMode.Open);
MyType newObj = (MyType)serializer.Deserialize(fs);

我发现这种方法唯一的问题是我不能为一个枚举指定多个值……

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1621306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档