Restsharp XML 反序列化

Qui*_*nes 2 c# xml xsd restsharp 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);
        }
Run Code Online (Sandbox Code Playgroud)

模型(使用 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;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

返回 XML :

<resources>
    <resource>...</resource>
    <resource>...</resource>
    <resource>...</resource>
</resources>
Run Code Online (Sandbox Code Playgroud)

在资源类/支持类中添加一个空的构造函数似乎没有帮助。有任何想法吗 ?还尝试直接反序列化资源而不是整个列表相同的错误。

Dej*_*sic 5

在遇到同样的问题后,我发现 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);
Run Code Online (Sandbox Code Playgroud)