反序列化可能是不同类型的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
如果您想要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); }
}
}