2015-08-28 40 views
2

我有一些问题反序列化HttpResponseMessage到一个对象。 问题是,当对象应该反序列化时,所有字段为空,不会引发异常。C#反序列化HttpResponseMessage对象

HttpContent content = new StringContent(xml); 
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("text/xml"); 
HttpResponseMessage response = await client.PostAsync("URL", content).ConfigureAwait(false); 
// Parse response 
if (response.IsSuccessStatusCode) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(ResponseObject)); 
    Stream responseStream = await response.Content.ReadAsStreamAsync(); 
    ResponseObject responseObject = serializer.Deserialize(responseStream) as ResponseObject; 

    //Possible example of wrong data 
    Console.WriteLine(responseObject.Message); 
} 

[XmlRoot("response")] 
public class ResponseObject 
{ 
    [XmlElement("session")] 
    public string Session { get; set; } 

    [XmlElement("status")] 
    public string Status { get; set; } 

    [XmlElement("message")] 
    public string Message { get; set; } 
} 

响应消息作为字符串

"<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?> 
<response> 
    <val n=\"session\">SESSION ID</val> 
    <val n=\"status\">201</val> 
    <val n=\"message\">Created</val> 
</response>" 

我错过了什么?我很新的序列化/反序列化。 感谢指点。

+0

会话,状态和消息是标签'val'的属性'n'的值。 – Eser

+0

ResponseObject是否不需要某些val元素集合以匹配XML? – Biscuits

+0

我是多么愚蠢......这就是我试图重新使用旧项目中的代码所得到的结果。周一,当我回到工作岗位时,我会继续努力。 – Mattias

回答

1

好的,我在Eser和Biscuits的帮助下解决了这个问题。

我试图重用代码,并没有真正考虑具有不同结构的响应消息,然后是早期的项目。

我改变了我的ResponseObject这样:

[XmlRoot("response")] 
public abstract class ResponseObject 
{ 
    [XmlIgnore] 
    public bool Success { get; set; } 

    [XmlIgnore] 
    public string Session 
    { 
     get 
     { 
      var result = Values.FirstOrDefault(n => n.Name == "session"); 
      return result.Value; 
     } 
    } 

    [XmlIgnore] 
    public string Status 
    { 
     get 
     { 
      var result = Values.FirstOrDefault(n => n.Name == "status"); 
      return result.Value; 
     } 
    } 

    [XmlIgnore] 
    public string Message 
    { 
     get 
     { 
      var result = Values.FirstOrDefault(n => n.Name == "message"); 
      return result.Value; 
     } 
    } 

    [XmlElement("val")] 
    public List<ResponseXmlWrapper<string>> Values; 
} 

public class ResponseXmlWrapper<T> 
{ 
    [XmlAttribute("n")] 
    [JsonProperty("n")] 
    public string Name { get; set; } 

    [XmlText] 
    [JsonProperty()] 
    public T Value { get; set; } 

    public ResponseXmlWrapper() 
    { 

    } 

    public ResponseXmlWrapper(string attributeName, T value) 
    { 
     Name = attributeName; 
     Value = value; 
    } 
} 

我不知道这是否是最佳的解决方案,但它的工作原理。