【问题标题】:Deserialization an xml element that could be different types反序列化可能是不同类型的 xml 元素
【发布时间】:2013-03-27 22:19:31
【问题描述】:

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

【问题讨论】:

    标签: c# xml-serialization


    【解决方案1】:

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

    这会将“Canceled”和“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>
    

    【讨论】:

      【解决方案2】:

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

      您可以自定义实现IXmlSerializable,但这很头疼。

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

      This Function 可能会帮到你很多,看起来它可以处理字符串或数值,但我不认为 XmlSerializer 可以使用它。最好使用可以使用 Parse 函数保存回 Enum 属性的字符串“dummy”。有关虚拟属性的示例,请参见 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); }
         }
      }
      

      【讨论】:

      • @Nevyn,您可以处理两种类型的数据(字符串,整数),默认情况下,xmlserializer 将反序列化枚举的字符串表示,但如果您想反序列化枚举的 int 值,您可以可以只使用 XmlEnum 并提供 int 值,现在它将处理字符串和 int 值。
      • @sa_ddam213 为过于复杂但仍然可用的解决方案欢呼:-)。我实际上不知道它会将它们反序列化为同一个可枚举。我确实知道序列化它们只会产生一个或另一个。 耸耸肩哦,好吧
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 2019-09-07
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-07
      相关资源
      最近更新 更多