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 XML反序列化

在遇到同样的问题后,我发现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;
相关文章: