反序列化可能是不同类型的xml元素

时间:2013-03-27 22:19:32

标签: c# xml-serialization

我需要在c#

中反序列化流动的xml
<Show>
   <status>Canceled</status>
</Show>

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

我的班级是

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

并且它有效,但我想将其反序列化为枚举,在此示例中取消等于2

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

有没有办法在不将public object status { get; set; }字符串值解析为枚举

的情况下执行此操作

2 个答案:

答案 0 :(得分:1)

如果您想使用名称或整数Deserialize Enum,可以使用Enum属性修饰XmlEnum并提供整数。

这会将“已取消”和“2”反序列化为您的枚举。

示例:

[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>

答案 1 :(得分:0)

你不能直接使用object,XmlSerializer只是拒绝使用泛型。对象仍然具有底层类型,当它被反序列化时,您不知道该类型是什么。我为它做了一个解决方法here,但它不是很漂亮,或者非常有用。

您可以自定义实施IXmlSerializable,但这是一个令人头痛的问题。

我假设问题的根源是你把它作为来自另一个源的输入,并且该字段可以是整数或文本,你想要存储为可枚举。您可能最好将其反序列化为字符串,然后稍后再解析它。这可能是最简单的方法。我能找到的其他任何东西要么只是反序列化字符串值,要么只反序列值,我不知道它们中的任何一个是否可以处理两种形式的数据,但似乎不太可能。

This Function可能会帮助你解决很多问题,看起来它可以处理字符串或数值,但我不认为XmlSerializer可以使用它。你最好使用字符串“dummy”,它可以使用Parse函数保存回Enum属性。有关虚拟属性的示例,请参阅this stackoverflow question

示例

一般来说,它看起来像这样:

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