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