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 をデフォルトに設定してください」のようなことを言いたいと思います。1 つの属性が破損したため、XML ファイル全体を破棄したくありません。

4

2 に答える 2

4

you can set you enum like this , so this will set "" value of enum to Unknown = 0 somewhat like default value

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

more detail check : XmlEnumAttribute Class

于 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 に答える