C# 反序列化错误

C# 反序列化错误,c#,.net,xml,serialization,deserialization,C#,.net,Xml,Serialization,Deserialization,尝试将某些数据反序列化到类中时出错。错误为:“System.RuntimeType由于其保护级别而不可访问。只能处理公共类型。” 这个错误和我做过的所有其他搜索都表明有些东西不是公开的。我已经把一切公之于众(但如果我可以避免的话,我不想这样做),但我仍然无法理解 这是我的原始代码: private void RequestTest() { SMDataRequest dataRequest = new SMDataRequest(); SMListInvoicesRequest

尝试将某些数据反序列化到类中时出错。错误为:“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;
    }
}
private void RequestTest()
{
SMDataRequest dataRequest=新的SMDataRequest();
SMListInvoicesRequest InvoicesRequest=新的SMListInvoicesRequest();
SMListInvoicesResponse响应=(SMListInvoicesResponse)dataRequest.GetData(InvoicesRequest);
}
公共类SMDataRequest
{
private const string URI=UriHere;
公共SMResponse GetData(SMRequest请求)
{
//SMR反应;
WebRequest WebRequest=WebRequest.Create(URI);
webRequest.Method=“POST”;
webRequest.ContentType=“text/XML”;
字符串参数=string.Format(request.GetRequest(),用户名,密码);
webRequest.ContentLength=参数.Length;
//写下请求
StreamWriter requestWriter=新的StreamWriter(webRequest.GetRequestStream(),Encoding.ASCII);
requestWriter.Write(参数);
requestWriter.Close();
//执行请求以获得响应
StreamReader responseReader=新的StreamReader(webRequest.GetResponse().GetResponseStream());
字符串响应=responseReader.ReadToEnd();
XmlDocument doc=新的XmlDocument();
doc.LoadXml(响应);
XmlNode=doc.SelectSingleNode(“响应”);
return request.GetResponse(node.FirstChild.InnerXml);
}
}
公共抽象类请求
{
公共抽象字符串操作{get;}
公共抽象字符串数据{get;}
公共抽象字符串行{get;}
内部常量字符串XML_ACTION=“{0}{1}”;
内部常量字符串XML_DATA=“{0}{1}”;
内部常量字符串XML_ROW=“{0}{1}”;
内部常量字符串XML_AUTH=“{0}{1}”;
私有只读字符串\u用户名;
私有只读字符串\u密码;
受保护的SMRequest()
{
//设置用户名和密码
}
公共字符串GetRequest()
{
返回string.Format(XML_ACTION,ACTION,GetDataInfo());
}
公共虚拟字符串GetDataInfo()
{
返回string.Format(XML_数据,GetAuthInfo(),数据);
}
受保护的内部抽象SMResponse GetResponse(字符串responseData);
内部字符串GetAuthInfo()
{
返回string.Format(XML\u AUTH、\u用户名、\u密码);
}
内部对象反序列化对象(字符串xml,对象数据)
{
对象结果=空;
xml=xml.Replace(“utf-16”、“utf-8”);
尝试
{
XmlSerializer serializer=新的XmlSerializer(data.GetType());
MemoryStream stream=新的MemoryStream(System.Text.Encoding.ASCII.GetBytes(xml));
结果=序列化程序。反序列化(流);
}
捕获(例外)
{
}
返回结果;
}
}
[可序列化]
公共类SMListInvoicesRequest:SMRequest
{
公共重写字符串操作
{
获取{返回“列出发票”;}
}
公共重写字符串数据
{
获取{return string.Empty;}
}
公共重写字符串行
{
获取{抛出新的NotImplementedException();}
}
受保护的内部覆盖SMResponse GetResponse(字符串响应数据)
{
SMListInvoicesResponse InvoicesResponse=新的SMListInvoicesResponse();
InvoiceResponse=(SMListInvoicesResponse)反序列化对象(responseData,InvoiceResponse.GetType());
返回的InvoiceResponse;
}
}

提前感谢您的帮助。

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

    invoiceReponse = (SMListInvoicesResponse)DeserializeObject(responseData, invoiceReponse.GetType());
第二个参数InvoiceResponse.GetType()被传递给数据参数,数据参数的使用方式如下:

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

我想你应该把电话改成只发送
invoiceResponse

谢谢。我盯着这个看太久了。