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

本文关键字:xml 元素 同类型 反序列化 | 更新日期: 2023-09-27 18:06:06

我需要在c#中反序列化流动的xml

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

,它可以工作但是我想将它反序列化成一个enum在这个例子中cancel等于2

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

如果不将public object status { get; set; }字符串值解析为enum

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

,是否有任何方法可以做到这一点?

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

这将反序列化"Canceled"answers"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>

您不能直接使用object, XmlSerializer拒绝使用泛型。对象仍然有一个基础类型,当它反序列化时,您不知道该类型是什么。我在这里做了一个变通,但它不是很漂亮,也不是很有用。

您可以自定义实现IXmlSerializable,但这是一个令人头疼的半。

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

这个函数可能会帮助你很多,当它涉及到,它看起来可以处理字符串或数值,但我不认为XmlSerializer可以使用它。您最好使用字符串"dummy",它可以使用Parse函数保存回Enum属性。有关dummy属性的示例,请参阅此stackoverflow问题。

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

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