[英]Restsharp XML Deserialization
我正在发布一个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);
}
模型(由API提供的xsd文件中的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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.