Restsharp XML反序列化
本文关键字:反序列化 XML Restsharp | 更新日期: 2023-09-27 18:24:40
我发布了一个get请求,它返回了一个xml文件,但当我试图将其反序列化为列表时,我得到了以下错误:
{"没有为此对象定义无参数构造函数。"}
RestClient类(调用GetResourceList):
public T Execute<T>(RestRequest request) where T : new()
{
var client = new RestClient();
client.BaseUrl = new Uri(m_URL);
client.Authenticator = new HttpBasicAuthenticator(m_Username, m_Password);
var response = client.Execute<T>(request);
if (response.ErrorException != null)
{
const string message = "Error retrieving response. Check inner details for more info.";
var exception = new ApplicationException(message, response.ErrorException);
throw exception;
}
return response.Data;
}
public List<resource> GetResourceList()
{
var request = new RestRequest();
request.Resource = "resource";
request.AddHeader("Accept", "application/xml");
return Execute<List<resource>>(request);
}
模型(使用xsd从API提供的xsd文件生成):
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class resource {
private string selfField;
private string userIDField;
private string firstNameField;
private string lastNameField;
private string extensionField;
private nameUriPair resourceGroupField;
private skillCompetency[] skillMapField;
private bool autoAvailableField;
private int typeField;
private nameUriPair teamField;
private resourcePrimarySupervisorOf primarySupervisorOfField;
private resourceSecondarySupervisorOf secondarySupervisorOfField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string self {
get {
return this.selfField;
}
set {
this.selfField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string userID {
get {
return this.userIDField;
}
set {
this.userIDField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string firstName {
get {
return this.firstNameField;
}
set {
this.firstNameField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string lastName {
get {
return this.lastNameField;
}
set {
this.lastNameField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string extension {
get {
return this.extensionField;
}
set {
this.extensionField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public nameUriPair resourceGroup {
get {
return this.resourceGroupField;
}
set {
this.resourceGroupField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlArrayAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
[System.Xml.Serialization.XmlArrayItemAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=false)]
public skillCompetency[] skillMap {
get {
return this.skillMapField;
}
set {
this.skillMapField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public bool autoAvailable {
get {
return this.autoAvailableField;
}
set {
this.autoAvailableField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public int type {
get {
return this.typeField;
}
set {
this.typeField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public nameUriPair team {
get {
return this.teamField;
}
set {
this.teamField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public resourcePrimarySupervisorOf primarySupervisorOf {
get {
return this.primarySupervisorOfField;
}
set {
this.primarySupervisorOfField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public resourceSecondarySupervisorOf secondarySupervisorOf {
get {
return this.secondarySupervisorOfField;
}
set {
this.secondarySupervisorOfField = value;
}
}
}
返回XML:
<resources>
<resource>...</resource>
<resource>...</resource>
<resource>...</resource>
</resources>
在资源类/支持类中添加一个空构造函数似乎没有帮助。有什么想法吗?还尝试直接反序列化资源,而不是整个列表相同的错误。
在遇到同样的问题后,我发现RestSharp对使用xsd.exe创建的类不太满意。
恢复到经典的反序列化程序:
System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(T));
using (StringReader sr = new StringReader(response.Content))
return (T)ser.Deserialize(sr);
关于GitHub,您不能反序列化数组。您必须使用列表。(https://github.com/restsharp/RestSharp/issues/547)
所以试试这个:
private List<skillCompetency> skillMapField;
而不是:
private skillCompetency[] skillMapField;