将 XmlArrayItemAttribute 反序列化为 PascalCase 属性 为 Null

Deserializing XmlArrayItemAttribute to PascalCase property is Null

我正在使用第 3 方 XML API 并复制了来自 API 的邮递员回复和“粘贴 XML 为 类”结果变成visual studio。这给了我一个具有以下内容的对象 属性:


    // NOTE: Generated code may require at least .NET Framework 4.5 or .NET Core/Standard 2.0.
    /// <remarks/>
    [System.SerializableAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
    public partial class forum : ItemBase
    {

        private forumThread[] threadsField;

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute("thread", IsNullable = false)]
        public forumThread[] threads
        {
            get
            {
                return this.threadsField;
            }
            set
            {
                this.threadsField = value;
            }
        }
    }

这很好地反序列化并捕获了所有数据。不过,我想稍微清理一下生成的代码,例如,我想重命名 属性 名称以及 forumList class 以遵循 C# PascalCase 约定。所以我想将 threads 重命名为 Threads,将 forumThread 重命名为 ForumThread。对于其他 attributes/properties 我已经通过向属性添加名称成功地做到了这一点,但在这种情况下不起作用,当我将生成的代码更改为此时,例如:

[XmlArrayItem("thread", ElementName = "threads", IsNullable = false)]
public forumThread[] Threads {get; set;}

它每次都反序列化为 null 并丢失来自 API 调用的数据。如有任何帮助,我们将不胜感激。

反序列化对象的class在这里:

public T Deserialize<T>(string xml) 
            where T : ItemBase
        {
            if (string.IsNullOrWhiteSpace(xml))
            {
                return null;
            }

            using var stringReader = new StringReader(xml);

            var serializer = new XmlSerializer(typeof(T));            
            var xmlReader = new XmlTextReader(stringReader);

            return (T)serializer.Deserialize(xmlReader);
        }

我们正在反序列化的 xml 样本:

<forum id="3" title="Testing Forum" numthreads="1816" numposts="13685" lastpostdate="Thu, 01 Jan 1970 00:00:00 +0000" noposting="0" termsofuse="https://boardgamegeek.com/xmlapi/termsofuse">
    <threads>
        <thread id="568813" subject="test thread" author="dakarp" numarticles="16" postdate="Tue, 28 Sep 2010 05:59:08 +0000" lastpostdate="Sat, 02 Apr 2022 11:57:08 +0000" />
        <thread id="1848343" subject="Test" author="Grafin" numarticles="1195" postdate="Thu, 14 Sep 2017 05:14:46 +0000" lastpostdate="Sun, 15 May 2022 13:39:34 +0000" />
   </threads>
</forum>

以下内容解决了该问题,似乎是正确反序列化所需的属性。我不太清楚生成的代码是如何实现相同结果的,但这巩固了我对 JSON 优于 xml

的偏好
    [XmlArray("threads")]
    [XmlArrayItem("thread")]
    public forumThread[] Threads { get; set; }