web-dev-qa-db-ja.com

列挙型の逆シリアル化

要素の1つに空白の属性があるxmlがあります。例:

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

現在、言語はスキーマから作成されたクラスの列挙型です。言語が指定されている場合は正常に機能し、空白の場合は逆シリアル化に失敗します(例を参照)。

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

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

このシナリオをどのように処理できますか

17
genericuser

Enumプロパティをnull許容として宣言できます。

public Language? Language { get; set; }

編集:わかりました、私はちょうど試しました、それは属性に対しては機能しません...ここに別のオプションがあります:このプロパティを直接シリアル化/逆シリアル化せず、代わりに文字列プロパティをシリアル化します:

[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);
        }
    }
}
19
Thomas Levesque

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

例えば:

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

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

16
Mike Hofer

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

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; }
      }

      .
      .
      .
   }
}
13
Vajda

結果をどうしたいですか?

列挙型はNULL可能でない値型であるため、ブランク値をNULL参照にマップすることはできません。

2
GuiSim
object wontBeNull = couldBeNull ?? defaultIfNull;

私が試してみたいものです。 Null合体演算子 と呼ばれ、null入力のデフォルトが必要な場合に使用します。

0
Camilo Martin