我们在项目中广泛使用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),它也抛出了一个异常,但是有源代码并且可以更改。这个项目使用不同的属性属性,需要相当多的更改,但可能是可行的。
任何其他建议。
发布于 2009-10-26 00:27:02
不幸的是,无法控制枚举值的反序列化方式……作为一种解决方法,您可以将枚举值序列化为字符串:
[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
}发布于 2013-03-21 17:13:15
为了便于将来参考,我认为最好的方法是使用XmlEnumAttribute,它告诉XMLSerializer每个枚举值的序列化和反序列化的名称。
public enum EmployeeStatus
{
[XmlEnum(Name = "Single")]
One,
[XmlEnum(Name = "Double")]
Two,
[XmlEnum(Name = "Triple")]
Three
}发布于 2012-02-03 23:18:15
我也一直在努力解决这个问题,我已经找到了使用XmlAttributeOverrides的部分解决方案。根据MS文档:
您可以重写XmlEnumAttribute的Name属性值,方法是创建XmlEnumAttribute类的实例并将其分配给XmlAttributes对象的XmlEnum属性。有关详细信息,请参见XmlAttributeOverrides类。
所以我这样做了:
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);我发现这种方法唯一的问题是我不能为一个枚举指定多个值……
https://stackoverflow.com/questions/1621306
复制相似问题