2010-11-22 27 views
12

要素の1つに空白の属性が含まれているxmlがあります。例えば、列挙値の逆シリアル化

<tests> 
<test language=""> 
..... 
</test> 
</tests> 

については は今、言語は、スキーマから作成されたクラスで列挙型です。言語が指定されていれば正常に動作し、空白の場合は(例のように)逆直列化に失敗します。

編集:逆シリアル化のためのコード:

XmlSerializer xmlserializer = new XmlSerializer(type); 
StringReader strreader = new StringReader(stringXML); 
Object o = serializer.Deserialize(strreader); 

がどのように私はあなたが結果になりたいだろうか、このシナリオに

+0

をあなたのデシリアライズコードを投稿することができますか? –

答えて

14

あなたはnullとして列挙型プロパティを宣言することができます:

public Language? Language { get; set; } 


EDITを:[OK]を、私はちょうど試みたが、それは属性のために動作しません...ここでは別のですオプション:このプロパティを直接シリアル化/逆シリアル化しないで、代わりに文字列プロパティをシリアル化してください。

[XmlIgnore] 
public Language Language { get; set; } 

[XmlAttribute("Language")] 
public string LanguageAsString 
{ 
    get { return Language.ToString(); } 
    set 
    { 
     if (string.IsNullOrEmpty(value)) 
     { 
      Language = default(Language); 
     } 
     else 
     { 
      Language = (Language)Enum.Parse(typeof(Language), value); 
     } 
    } 
} 
+0

ITが「タイプを反映しているときにエラーが発生しました」というエラーが表示されます。 – genericuser

+0

これはまた、カプセル化IMHOの不良であるnull値をそこに格納できることを意味します。この場合はnullを指定できないようにして、setterのdefeault値に変換する方が良いでしょう。 –

+0

@Priya、私の更新された回答を参照してください –

2

を扱うことができますか?

enumがnull値ではない値型なので、空白の値をnull参照にマップすることはできません。

+0

ええ、私は知っています。私は同じものに対する回避策が何であるか考えています。 – genericuser

0
object wontBeNull = couldBeNull ?? defaultIfNull; 

私は何をしようとしていますか? Null-Coalescing operatorと呼ばれています。ヌル入力のデフォルトを使用するときに使用します。

+0

これを実装する方法がわかりません。私はデニリアライズするべき列挙型のプロパティを持っています。私はそれを宣言するときにどのようにプロパティでこれを言いますか? – genericuser

+0

真剣に、try-catchブロックを考えましたか?デシリアライゼーションの前後に配置すると、多くのエラーや不正な形式のXMLファイルを検出できます。 –

14

おそらく列挙をマークアップし、不明を表すデフォルトの項目を追加する必要があります。例えば

Public Enum EmployeeStatus 
    <XmlEnum("")> Unknown = 0 
    <XmlEnum("Single")> One = 1 
    <XmlEnum("Double")> Two = 2 
    <XmlEnum("Triple")> Three = 3 
End Enum 

詳細については、hereを参照してください。

12

あなたはそれをこのように行うことができます。

namespace Example 
{ 

    public enum Language 
    { 
    [XmlEnum("en")] 
    English, 

    [XmlEnum("de")] 
    Deutsch 
    } 

    public class ExampleClass 
    { 

     private Language? language; 

     [XmlAttribute("Language")] 
     public Language Language 
     { 
     get { return language ?? Example.Language.English; } 
     set { language = value; } 
     } 

     . 
     . 
     . 
    } 
} 
関連する問題