2012-11-26 12 views
7

EDIT作品:私は私が何かをしようとのthougtの質問をした瞬間を... 私はリクエストに応じてXmlNamespaceプロパティを設定して、それがトリックをしました。..RestSharpデシリアライズは、空のプロパティを返しますがxml.deserializeテストは

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

次の問題はRestSharpは、オブジェクトのプロパティとしてXML atributesを認識するようになっている

しかし、私は本当に理由を理解していない...


私は週末のうちにこれを乗り越えてきました。

私はRestFul webservice(MusicBrainz)のラッパーを作成しようとしています。私は簡単な例でテストしています:あるアーティストの詳細を取得し、それをカスタムArtistオブジェクトに入れます。

私はRestClientでExecuteを実行するとOKですがオブジェクトのプロパティは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およびXmlNamespaceプロパティに基づいてそれがになり、にコピーされます。 XmlDeserializer

は、ここでは、コードfrom 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をマッピングすることはできませんし、代わりにデフォルト/ヌル値を取得します。あなたがXmlNamespaceを設定しない場合、デシリアライザは基本的に応じて、すべての名前空間を無視し、唯一の自分の名前ですべてのプロパティをマッピングし自動検出を行いますデフォルトの実装(手動XmlDeserializerを作成する)ための今

、 。

参照ソースコードfrom XmlDeserializer:それは仕事を始めた理由を明示的にこのラインを使用して要求オブジェクト内の一致する名前空間にXmlNamespaceプロパティを設定した後、アカウントに上記のすべての撮影

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

、それは明らかだ:

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

Executeメソッドは、名前空間をデシリアライザにコピーし、XMLを適切にオブジェクトにマップしました。

関連する問題