c# - 反序列化错误

标签 c# .net xml serialization deserialization

尝试将某些数据反序列化为类时出现错误。错误是:“System.RuntimeType 由于其保护级别而无法访问。只能处理公共(public)类型。”

错误和我所做的所有其他搜索都表明某些内容不公开。我已将所有内容公开(但如果可以避免,我不想这样做),但仍然无法弄清楚。

这是我的原始代码:

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

关于c# - 反序列化错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8192119/

相关文章:

c# - 处理用户控件 (MVVM) 中的输入手势

.net - 使用 Ansible 安装 .Net Framework 4.6.1

c# - Unity Firebase 订阅/取消订阅重新加载应用程序的主题问题

c# - 通过字符串和 varchar(max) 之间的比较来更新查询

c# - MigraDoc - 加粗段落中的某些文本

c# - 在 .Net 中覆盖/处理我自己的类型转换

java - Jackson的节点结构可以用来写XML吗?

iphone - xPath 分组如何?

xml - 将 xml 存储在 json 对象中

c# - 脚手架和显示/编辑器模板