2015-08-28 59 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; 
    } 
} 

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