나는 내가 찾을 수있는 한 많은 기사를 읽었고, 나는 전에 이런 식으로 직렬화를 해봤지만 내 인생에서 왜 다음이 제대로 작동하지 않는지 알 수 없다.
도움을 주셔서 감사합니다.
이 코드가 주어지면 :
deseralized 응답을위한 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."}
빠른 인스턴스를 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>
그래서 당신의 XML은 MyResponseClass
. 내가 사용한 직렬화 코드는 다음과 같습니다.
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을 고수 하려면 XML 루트로서를 모두 소문자로 MyResponseClass
지정하지 않고 지정해야합니다 Response
.
[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);
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다