【问题标题】:C# XML deserialization issueC# XML 反序列化问题
【发布时间】: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 提供的答案之一可以正常工作。

标签: c# xml deserialization


【解决方案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 下面提供的答案工作正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    相关资源
    最近更新 更多