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 反序列化问题的主要内容,如果未能解决你的问题,请参考以下文章

C# Xml 反序列化错误

XML反序列化C#数组

如何使用 C# 映射反序列化 XML 文档

使用 C# 代码和 F# 模型的 XML 反序列化

C#从xml反序列化日期时间

使用 SOAP 请求 C# 的 XML 序列化和反序列化