4

我有一个看起来像这样的类(高度简化):

public class Foo
{
    public enum Value
    {
        ValueOne,
        ValueTwo
    }

    [XmlAttribute]
    public Value Bar { get; set; }
}

我从外部源接收 XML 文件。他们的文档指出 Foo 元素在 Bar 属性中只会有“ValueOne”或“ValueTwo”(他们不提供 XSD)。

所以,我像这样反序列化它:

 var serializer = new XmlSerializer(typeof(Foo));
 var xml = "<Foo Bar=\"ValueTwo\" />";
 var reader = new StringReader(xml);

 var foo = (Foo)serializer.Deserialize(reader);

...而且一切正常。

然而,昨晚,他们向我发送了一些看起来像这样的 XML ,而我的反序列化失败了(应该如此):<Foo Bar="" />

有没有一种很好的方法来围绕这个进行防御性编码?理想情况下,我想说“如果这里出现问题,默认使用 ValueOne”。我不想丢弃整个 XML 文件,因为单个属性被破坏了。

4

2 回答 2

4

你可以像这样设置你的枚举,所以这会将枚举的“”值设置为 Unknown = 0 有点像默认值

public enum Foo
{
   [XmlEnum(Name = "")]
   Unknown =0,
   [XmlEnum(Name = "Single")]
   One,
   [XmlEnum(Name = "Double")]
   Two   
}

更详细的检查:XmlEnumAttribute 类

于 2012-10-31T14:22:22.110 回答
0

击落XmlSerializer.. 使用LINQ2XML完成这个简单的任务

XElement doc=XElement.Load("yourStreamXML"); 

List<Foo> yourList=doc.Descendants("Foo")
.Select(x=>
new Foo
{
    Bar=(Enum.GetNames(typeof(Value)).Contains(x.Attribute("Bar").Value))?((this.Value)x.Attribute("Bar")):(this.Value.ValueOne);
}
).ToList<Foo>();

所以,我基本上是这样做的

if(Enum.GetNames(typeof(Value)).Contains(x.Attribute("Bar").Value))
//if the xml bar value is a valid enum
    Bar=(this.Value)x.Attribute("Bar");
else//xml bar value is not a valid enum..so use the default enum i.eValueOne
    Bar=this.Value.ValueOne;
于 2012-10-31T14:39:43.437 回答