Ошибка десериализации - PullRequest
2 голосов
/ 19 ноября 2011

Я получаю сообщение об ошибке при попытке десериализации некоторых данных в классе. Ошибка: «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;
    }
}

Заранее благодарю за помощь.

1 Ответ

2 голосов
/ 19 ноября 2011

Вы пытаетесь десериализовать тип:

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

Второй параметр, invoiceReponse.GetType (), передается параметру данных, а параметр данных используется следующим образом:

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

Я думаю, что вы должны изменить свой звонок, чтобы просто отправить invoiceResponse.

...