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