1

我需要在 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; }字符串值解析为枚举

4

2 回答 2

1

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

这会将“已取消”和“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>
于 2013-03-27T22:41:56.777 回答
0

你不能object直接使用,XmlSerializer 只是拒绝使用泛型。对象仍然有一个底层类型,当它反序列化时,你不知道那个类型是什么。我在这里为它做了一个解决方法,但它不是很漂亮,也不是很有用。

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

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

这个函数可能会帮到你很多,看起来它可以处理字符串或数值,但我不认为 XmlSerializer 可以使用它。最好使用可以使用 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); }
   }
}
于 2013-03-27T22:38:38.590 回答