简体   繁体   English

Restsharp XML反序列化

[英]Restsharp XML Deserialization

I am posting a get request and it returns a xml file, but when I try to deserialize it into a list I get the following error : 我正在发布一个get请求,它返回一个xml文件,但是当我尝试将其反序列化为列表时,出现以下错误:

{"No parameterless constructor defined for this object."} {“没有为此对象定义无参数构造函数。”}

RestClient class (calling GetResourceList): 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);
        }

Model (generated with xsd from a xsd file provided by the API): 模型(由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;
            }
        }
    }

Return XML : 返回XML:

<resources>
    <resource>...</resource>
    <resource>...</resource>
    <resource>...</resource>
</resources>

Adding a empty constructor in the resource class / supporting classes doesn't seem to help. 在资源类/支持类中添加空的构造函数似乎无济于事。 Any idea's ? 有任何想法吗 ? Also tried deserializing a resource directly instead of the whole list same error. 还尝试直接反序列化资源而不是整个列表相同的错误。

After running in to the same issue, I found that RestSharp doesn't play nice with the classes created using xsd.exe. 遇到相同的问题后,我发现RestSharp在使用xsd.exe创建的类中表现不佳。

Reverted back to the classic deserializer: 回到经典的解串器:

System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(T));

using (StringReader sr = new StringReader(response.Content))
    return (T)ser.Deserialize(sr);

Regarding to GitHub you can not deserialize Arrays. 关于GitHub,您不能反序列化数组。 You have to use List instead. 您必须改为使用列表。 ( https://github.com/restsharp/RestSharp/issues/547 ) https://github.com/restsharp/RestSharp/issues/547

So try this one: 所以试试这个:

private List<skillCompetency> skillMapField;

instead of: 代替:

private skillCompetency[] skillMapField;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM