【问题标题】:What is wrong with this C# XML Deserialization code?这个 C# XML 反序列化代码有什么问题?
【发布时间】:2017-10-23 12:45:15
【问题描述】:

我已经阅读了尽可能多的文章,我以前也用这种方式进行过序列化,但我一生都无法弄清楚为什么以下内容不能正常工作。

感谢您的帮助。

鉴于此代码:

反序列化响应的 POCO 类:

[XmlRoot]
public class MyResponseClass
{
    [XmlElement("response")]
    public Response Response { get; set; }
}

[XmlRoot]
public class Response
{
    [XmlElement("error")]
    public Error Error { get; set; }

    [XmlElement("sid")]
    public string Sid { get; set; }
}

[XmlRoot]
public class Error
{
    [XmlElement("error_msg")]
    public string ErrorMessage { get; set; }
}

请求和响应处理代码:

var webClient = _webClientWrapperFactory.Create();
var url = "https://serviceendpoint.com";
var responseString = webClient.DownloadString(url);

MyResponseClass result;
var serializer = new XmlSerializer(typeof(MyResponseClass));
using (var reader = new StringReader(responseString))
{
result = (MyResponseClass) serializer.Deserialize(reader);
}
return result;

返回此响应:

<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><response><error><error_msg>CANNOT_LOGIN</error_msg></error></response>

反序列化尝试抛出此错误:

System.Xml.dll 中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理

附加信息:XML 文档中存在错误 (1, 57)。

编辑: 内部异常:

{"<response xmlns=''> was not expected."}

【问题讨论】:

  • InnerException: "&lt;response xmlns=''&gt; was not expected."
  • 尝试从ResponseError 中删除XmlRoot 属性,因为它只允许在xml 的根对象中使用

标签: c# xml serialization deserialization xml-deserialization


【解决方案1】:

我创建了一个MyResponseClass 的快速实例并将其序列化:

<?xml version="1.0" encoding="utf-16"?>
<MyResponseClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <response>
    <error>
      <error_msg>error message text</error_msg>
    </error>
    <sid>(sid string)</sid>
  </response>
</MyResponseClass>

这就是MyResponseClass 的 XML 应该是这样的。这是我使用的序列化代码:

MyResponseClass result1 = new MyResponseClass
{
    Response = new Response
    {
        Sid = "(sid string)",
        Error = new Error
        {
            ErrorMessage = "error message text"
        }
    }
};

var serializer = new XmlSerializer(typeof(MyResponseClass));
string serialized = "";

using (StringWriter textWriter = new StringWriter())
{
    serializer.Serialize(textWriter, result1);
    serialized = textWriter.ToString();
}

但这可能不是你想要的。

如果您想坚持使用问题中的 XML,则需要省略 MyResponseClass 并指定 Response 作为 XML 根,全部小写:

[XmlRoot("response")]
public class Response
{
    [XmlElement("error")]
    public Error Error { get; set; }

    [XmlElement("sid")]
    public string Sid { get; set; }
}

...

var responseString = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><response><error><error_msg>CANNOT_LOGIN</error_msg></error></response>";

var serializer2 = new XmlSerializer(typeof(Response));

//using (StringWriter textWriter = new StringWriter())
//{
//    serializer2.Serialize(textWriter, result1.Response);
//    responseString = textWriter.ToString();
//}

Response result;
using (var reader = new StringReader(responseString))
{
    result = (Response)serializer2.Deserialize(reader);
}

【讨论】:

  • 呃,总是很傻,不是吗?谢谢你。您认为 XML 不可变的假设是正确的 - 这是来自 3rd 方服务的响应。再次感谢您的快速协助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多