2011-11-19 122 views
2

试图将某些数据反序列化到类中时出现错误。错误是:“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; 
    } 
} 

预先感谢您的帮助。

回答

2

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

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

第二个参数,invoiceReponse.GetType(),被传递到数据参数,并用于将数据参数如下:

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

我认为你应该改变你的电话,只发送invoiceResponse

+1

谢谢。我一直盯着这太久。 –