2012-11-26 41 views
7

編輯:我問我thougt的嘗試一些問題的時刻.. 我設置XML命名空間屬性的請求,該訣竅..RestSharp反序列化返回空屬性,但xml.deserialize測試工作

request.XmlNamespace = "http://musicbrainz.org/ns/mmd-2.0#"; 

但我真的不明白,爲什麼...

接下來的問題是越來越RestSharp識別XML atributes爲對象屬性


我在這個週末的大部分時間裏都一直在努力,我只是不明白這一點。

我想寫一個包裝圓RestFul web服務(MusicBrainz)。我正在測試一個簡單的例子:獲取一位藝術家的細節並將其放入自定義藝術家對象中。

當我做了對RESTClient實現執行它最終確定,但我的對象屬性爲null .. 但是當我測試反序列化與XmlDeserializer的objectproperties被填充(但不包括對應於一個屬性的屬性,但我稍後會解決)

響應的反序列化和將對象放入response.data之間會發生什麼? 很可能是一個「新手」的錯誤我做,因爲這是我的RestSharp第一步..

幫助會非常感激..

Returnded XML:

<metadata> 
    <artist type="Group" id="f1548c5b-329e-4036-921c-02213a04b525"> 
     <name>Uriah Heep</name> 
      <sort-name>Uriah Heep</sort-name> 
      <country>GB</country> 
      <life-span> 
       <begin>1970</begin> 
      </life-span> 
    </artist> 
</metadata> 

我類:

public class Artist 
{ 
    public int Id { get; set; } 
    public string Type { get; set; } 
    public string Name { get; set; } 
    public string SortName { get; set; } 
    public string Country { get; set; } 

} 

在下面的代碼輸出屬性被填充

var output = xml.Deserialize<Artist>(response); 

但調用

var response = client.Execute<T>(request); 

完整代碼(我已經把測試代碼的通用方法爲簡單起見)時相同的響應不填充屬性:

public T Execute<T>(RestRequest request) where T : new() 
{ 
    var client = new RestClient(); 
    client.BaseUrl = BaseUrl; 
    client.Authenticator = null; 

    //does not fill properties 
    var response = client.Execute<T>(request); 

    if (response.ErrorException != null) 
    { 
     throw response.ErrorException; 
    } 
    var xml = new XmlDeserializer(); 

    //fills properties 
    var output = xml.Deserialize<Artist>(response); 

    return response.Data; 
} 
+1

我找到了我感興趣的解決方案:-) –

+0

@AndersBornholm。自從我在這個項目上做了一些工作已經很長時間了。但就我的記憶而言,「解決方案」是在RestSharp請求上設置一個名稱空間。如果您真的絕望,我可以挖掘該項目並仔細查看... – FasterRaf

+0

我其實並沒有在我的項目要麼很長一段時間。如果我沒有記錯,我使用restsharp以外的東西解決了它:-) –

回答

0

這是因爲Execute方法,接收響應之後,試圖談判它基於請求的rootElement的與XML命名空間屬性和它們複製到XmlDeserializer

這裏有一個代碼from RestClient

 handler.RootElement = request.RootElement; 
    handler.DateFormat = request.DateFormat; 
    handler.Namespace = request.XmlNamespace; 
    response.Data = handler.Deserialize<T>(raw); 

如果傳遞RestRequest有不匹配的XML命名空間,RestSharp的XmlDeserializer(使用的XDocument幕後)將無法響應XML映射到對象的屬性和您將獲得默認/空值。

現在的默認實現(當手動創建XmlDeserializer),如果你沒有設置XML命名空間,解串器會做一個自動檢測,基本上忽略了響應的所有命名空間,只有通過他們的名字的所有屬性映射。

查看源代碼from XmlDeserializer

 // autodetect xml namespace 
    if (!Namespace.HasValue()) 
    { 
     RemoveNamespace(doc); 
    } 

考慮到所有上述因素,很明顯,爲什麼它開始在這一行你的請求對象明確設置後XML命名空間屬性工作到匹配的命名空間:

 request.XmlNamespace = "http://musicbrainz.org/ns/mmd-2.0#"; 

Execute方法將名稱空間複製到反序列化器中,並將XML映射到適當的對象。