C# XML 反序列化问题
Posted
技术标签:
【中文标题】C# XML 反序列化问题【英文标题】:C# XML deserialization issue 【发布时间】:2021-03-28 02:27:08 【问题描述】:要反序列化的XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<changes next="296">
<change>
<objectid>E702C43C-E04B-450B-BEBC-76646AB299C5</objectid>
<parentid>ED98C97F-A202-48ED-AEEA-34362508A30B</parentid>
<objecttype>file</objecttype>
<listentype>remove</listentype>
</change>
<change>
<objectid>3A242975-CEF0-432B-A997-B33D85C138C8</objectid>
<parentid>ED98C97F-A202-48ED-AEEA-34362508A30B</parentid>
<objecttype>file</objecttype>
<listentype>add</listentype>
</change>
</changes>
使用的数据模型:
[XmlRoot("changes")]
public class ChangeListener
public List<Change> Changes get; set;
[XmlRoot("change")]
public class Change
[XmlElement("objectid")]
public Guid objectid get; set;
[XmlElement("parentid")]
public Guid parentid get; set;
[XmlElement("objecttype")]
public string objecttype get; set;
[XmlElement("listentype")]
public string listentype get; set;
反序列化代码,这里的结果是上面xml的字符串格式:
(ChangeListener)new XmlSerializer(typeof(ChangeListener)).Deserialize(new MemoryStream(Encoding.UTF8.GetBytes(result)))
但我收到此代码的错误;我也尝试了几件事,例如将ChangeListener
类的Changes
属性标记为[XmlElement("changes")]
,而不是将类标记为xmlroot,但它也不起作用。
请提出解决此问题的好方法。
【问题讨论】:
“我遇到了错误” - 但您并没有告诉我们什么错误。请编辑您的问题并添加细节。如果您进行了更改,请具体说明更改并将具体错误与您尝试的代码版本相匹配。 这是未格式化的异常,但在我的情况下,rich-n 提供的答案之一可以正常工作。 【参考方案1】:问题在于 ChangeListener 中的更改列表使序列化程序感到困惑,因为 XML 中没有任何称为“更改”的内容。
我们需要做的唯一更改是使用[XmlElement("change")]
注释更改声明,如下所示:
[XmlRoot("changes")]
public class ChangeListener
[XmlElement("change")]
public List<Change> Changes get; set;
然后显示的 XML 会正确反序列化。
【讨论】:
【参考方案2】:上述 XML 的类应如下所示。
[XmlRoot(ElementName="change")]
public class Change
[XmlElement(ElementName="objectid")]
public string Objectid get; set;
[XmlElement(ElementName="parentid")]
public string Parentid get; set;
[XmlElement(ElementName="objecttype")]
public string Objecttype get; set;
[XmlElement(ElementName="listentype")]
public string Listentype get; set;
[XmlRoot(ElementName="changes")]
public class Changes
[XmlElement(ElementName="change")]
public List<Change> Change get; set;
[XmlAttribute(AttributeName="next")]
public string Next get; set;
【讨论】:
我认为这可行,但我们不需要将 Guid 更改为字符串,对吗?它也适用于 Guid。【参考方案3】:尝试将 objectid 和 parentid 的类型从 Guid 更改为字符串。 如果仍然出现错误,请分享错误详情。
【讨论】:
GUID 没有问题。 Rich-n 下面提供的答案工作正常。以上是关于C# XML 反序列化问题的主要内容,如果未能解决你的问题,请参考以下文章