簡體   English   中英

RestSharp Deserialize返回空屬性,但xml.deserialize測試有效

[英]RestSharp Deserialize returns empty properties but xml.deserialize test works

編輯:當我問我嘗試某事的問題時......我已經在請求上設置了XmlNamespace屬性,這就是訣竅..

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

但我真的不明白為什么......

下一個問題是讓RestSharp將xml屬性識別為對象屬性


在周末的大部分時間里,我一直在討論這個問題,而我卻沒有讓它發揮作用。

我正在嘗試圍繞RestFul webservice(MusicBrainz)編寫一個包裝器。 我正在測試一個簡單的例子:獲取一位藝術家的詳細信息並將其放入自定義的Artist對象中。

當我在RestClient上執行Execute時,它結束了,但我的對象屬性為null。但是當我使用XmlDeserializer測試反序列化時,objectproperties被填充(但不是對應於屬性的屬性,但我稍后會解決這個問題) )

在響應的反序列化和將對象放在response.data之間會發生什么? 很可能這是我正在制作的“新手”錯誤,因為這是我使用RestSharp的第一步。

幫助將不勝感激..

退回的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;
}

發生這種情況是因為Execute方法在接收到響應后,會嘗試根據請求的RootElement和XmlNamespace屬性進行協商 ,並將它們復制XmlDeserializer

這是RestClient的代碼:

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

如果使用不匹配的XmlNamespace傳遞RestRequest,則RestSharp的XmlDeserializer (在后台使用XDocument)將無法將響應XML映射到對象屬性,您將獲得默認值/ null值。

現在對於默認實現(當您手動創建XmlDeserializer ),如果未設置XmlNamespace,則反序列化器將執行自動檢測 ,該檢測基本上忽略響應中的所有命名空間,並僅根據其名稱映射所有屬性。

請參閱XmlDeserializer的源代碼:

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

考慮到以上所有因素,很清楚為什么在您使用以下行將XmlNamespace屬性顯式設置為請求對象中的匹配命名空間后,它開始工作:

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

Execute方法將名稱空間復制到反序列化器中,並將XML映射到對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM