反序列化错误

本文关键字:错误 反序列化 | 更新日期: 2023-09-27 18:15:05

我得到一个错误时,试图反序列化一些数据到一个类。错误是:"System。"由于其保护级别,RuntimeType无法访问。只能处理公共类型。"

错误和我所做的所有其他搜索都说有些东西不是公开的。我已经把所有的东西都公开了(但我不想这样做,如果我可以避免的话),但仍然不明白。

这是我的原始代码:

private void RequestTest()
{
    SMDataRequest dataRequest = new SMDataRequest();
    SMListInvoicesRequest invoiceRequest = new SMListInvoicesRequest();
    SMListInvoicesResponse response = (SMListInvoicesResponse)dataRequest.GetData(invoiceRequest);
}

public class SMDataRequest
{
    private const string URI = UriHere;
    public SMResponse GetData(SMRequest request)
    {
        //SMResponse response;
        WebRequest webRequest = WebRequest.Create(URI);
        webRequest.Method = "POST";
        webRequest.ContentType = "text/XML";
        string parameters = string.Format(request.GetRequest(), USERNAME, PASSWORD);
        webRequest.ContentLength = parameters.Length;
        // Write the request
        StreamWriter requestWriter = new StreamWriter(webRequest.GetRequestStream(), Encoding.ASCII);
        requestWriter.Write(parameters);
        requestWriter.Close();
        // Do the request to get the response
        StreamReader responseReader = new StreamReader(webRequest.GetResponse().GetResponseStream());
        string response = responseReader.ReadToEnd();
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(response);
        XmlNode node = doc.SelectSingleNode("response");
        return request.GetResponse(node.FirstChild.InnerXml);
    }
}

public abstract class SMRequest
{
    public abstract string Action { get; }
    public abstract string Data { get; }
    public abstract string Row { get; }
    internal const string XML_ACTION = "<root><action>{0}</action>{1}</root>";
    internal const string XML_DATA = "<data>{0}{1}</data>";
    internal const string XML_ROW = "<row>{0}{1}</row>";
    internal const string XML_AUTH = "<auth_username>{0}</auth_username><auth_password>{1}</auth_password>";
    private readonly string _userName;
    private readonly string _password;
    protected SMRequest()
    {
       //Set username and password
    }
    public string GetRequest()
    {
        return string.Format(XML_ACTION, Action, GetDataInfo());
    }
    public virtual string GetDataInfo()
    {
        return string.Format(XML_DATA, GetAuthInfo(), Data);
    }
    protected internal abstract SMResponse GetResponse(string responseData);
    internal string GetAuthInfo()
    {
        return string.Format(XML_AUTH, _userName, _password);
    }
    internal object DeserializeObject(string xml, object data)
    {
        object result = null;
        xml = xml.Replace("utf-16", "utf-8");
        try
        {
            XmlSerializer serializer = new XmlSerializer(data.GetType());
            MemoryStream stream = new MemoryStream(System.Text.Encoding.ASCII.GetBytes(xml));
            result = serializer.Deserialize(stream);
        }
        catch (Exception)
        {
        }
        return result;
    }
}

[Serializable]
public class SMListInvoicesRequest : SMRequest
{
    public override string Action
    {
        get { return "list-invoices"; }
    }
    public override string Data
    {
        get { return string.Empty; }
    }
    public override string Row
    {
        get { throw new NotImplementedException(); }
    }
    protected internal override SMResponse GetResponse(string responseData)
    {
        SMListInvoicesResponse invoiceReponse = new SMListInvoicesResponse();
        invoiceReponse = (SMListInvoicesResponse)DeserializeObject(responseData, invoiceReponse.GetType());
        return invoiceReponse;
    }
}

提前感谢您的帮助

反序列化错误

您正在尝试反序列化类型:

    invoiceReponse = (SMListInvoicesResponse)DeserializeObject(responseData, invoiceReponse.GetType());

第二个参数invoiceReponse.GetType()被传递给data参数,data参数的使用如下:

XmlSerializer serializer = new XmlSerializer(data.GetType());

我觉得你应该把电话改成只叫invoiceResponse