将 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; }
我正在使用第 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; }