1

I need to deserialize the flowing xml in c#

<Show>
   <status>Canceled</status>
</Show>

<Show>
    <status>2</status>
</Show>

my class is

[XmlRoot("Show")]`
public class Show
{
   [XmlElement(ElementName = "status")]
   public object status { get; set; }
}

and it works but i would like to deserialize it into an enum where in this example cancel is equal 2

public enum ShowStatus
{
   [XmlEnum("Canceled")]
   Canceled = 2
}

is there any way to do that without parse the public object status { get; set; } string value to enum

4

2 に答える 2

1

名前または整数を使用する場合はDeserialize、with属性をEnum装飾して整数を指定できます。EnumXmlEnum

これにより、「キャンセル済み」と「2」が Enum として逆シリアル化されます。

例:

[XmlRoot("Show")]
public class Show
{
    [XmlElement(ElementName = "status")]
    public ShowStatus status { get; set; }
}

public enum ShowStatus
{
    [XmlEnum("2")]
    Canceled = 2
}

テスト XML:

<?xml version="1.0"?>
<ArrayOfShow xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Show>
    <status>Canceled</status>
  </Show>
  <Show>
    <status>2</status>
  </Show>
</ArrayOfShow>
于 2013-03-27T22:41:56.777 に答える
0

直接使用することはできませんobject。XmlSerializer は単にジェネリックの操作を拒否します。オブジェクトにはまだ基礎となる型があり、逆シリアル化されると、その型が何であるかわかりません。ここで回避策を作成しましたが、あまりきれいではなく、非常に便利でもありません。

カスタム実装できますIXmlSerializableが、それは頭痛の種です。

問題の原因は、これを別のソースからの入力として取り込んでいることであり、フィールドは整数またはテキストのいずれかであり、列挙可能として保存したいと考えています。おそらく、それを文字列にデシリアライズしてから、後で単純に解析する方がよいでしょう。それがおそらく最も簡単な方法でしょう。私が見つけることができる他のすべては、文字列値のみ、または整数値のみを逆シリアル化することです。どちらかが両方の形式のデータを処理できるかどうかはわかりませんが、ありそうにありません。

この関数は、文字列または数値を処理できるように見えますが、XmlSerializer で使用できるとは思えません。Parse 関数を使用して Enum プロパティに保存できる文字列「ダミー」を使用することをお勧めします。ダミー プロパティの例については、このスタック オーバーフローの質問を参照してください。

一般的に言えば、次のようになります。

[XmlRoot("Show")]`
public class Show
{
   [XmlIgnore()]
   public ShowStatus status { get; set; }

   [XmlElement(ElementName = "status")]
   public string StatusString
   {
       get { return status.ToString(); }
       set { status = Enum.Parse(ShowStatus, value); }
   }
}
于 2013-03-27T22:38:38.590 に答える