2012-11-26 38 views
7

संपादित करें: इस समय मैं सवाल मैं कुछ कोशिश कर के thougt पूछा .. मैं अनुरोध पर XmlNamespace संपत्ति निर्धारित किया है और कहा कि चाल किया था ..RestSharp deserialize खाली गुण देता है लेकिन xml.deserialize परीक्षण काम करता है

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

लेकिन मैं वास्तव में क्यों के रूप में समझ में नहीं आता ...

अगला समस्या RestSharp वस्तु गुण के रूप में एक्सएमएल गुण पहचान करने के लिए हो रही है


मैं इस सप्ताह के अधिकांश सप्ताह के लिए जा रहा हूं और मैं इसे काम करने के लिए नहीं मिला हूं।

मैं एक रेस्टफुल webservice (MusicBrainz) के चारों ओर एक रैपर लिखने की कोशिश कर रहा हूं। मैं एक साधारण उदाहरण के साथ परीक्षण कर रहा हूं: एक कलाकार का विवरण प्राप्त करें और इसे कस्टम कलाकार ऑब्जेक्ट में रखें।

जब मैं एक RestClient पर निष्पादित यह ठीक समाप्त हो जाती है, लेकिन मेरी वस्तु गुण अशक्त हैं है .. लेकिन जब मैं XmlDeserializer साथ अक्रमांकन परीक्षण objectproperties भर रहे हैं (लेकिन गुण है कि एक विशेषता के अनुरूप के लिए नहीं है, लेकिन मैं 'बाद में इसका सामना करेंगे)

प्रतिक्रिया के deserialization और object.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। यह एक लंबा समय रहा है क्योंकि मैंने इस परियोजना पर कुछ काम किया है। लेकिन जहां तक ​​मेरी याददाश्त "समाधान" को रेस्टशर्प अनुरोध पर नामस्थान सेट करना था .. यदि आप वास्तव में हताश हैं तो मैं प्रोजेक्ट खोद सकता हूं और नज़दीक दिख सकता हूं ... – FasterRaf

+0

मैंने वास्तव में काम नहीं किया है मेरी परियोजना या तो लंबे समय तक। अगर मैं सही ढंग से याद करता हूं तो मैंने इसे restsharp के अलावा किसी अन्य चीज़ का उपयोग करके हल किया :-) –

उत्तर

0

यह ऐसा होता है क्योंकि प्रतिक्रिया प्राप्त करने के बाद Execute विधि, पर अनुरोध करता है पर अनुरोध करता है कि यह अनुरोध की रूटइलेमेंट और एक्सएमएल नेमस्पेस गुणों और पर आधारित है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 उपयोग करता है) नहीं एक वस्तु गुण के जवाब एक्सएमएल मैप करने के लिए सक्षम हो जाएगा और आपको इसके बजाय डिफ़ॉल्ट/शून्य मान मिलेगा।

डिफ़ॉल्ट कार्यान्वयन के लिए अब

(जब आप XmlDeserializer मैन्युअल रूप से बनाते), आप एक XmlNamespace सेट नहीं है, deserializer एक ऑटो का पता लगाने कि मूल रूप से जवाब में सभी नामस्थान ध्यान नहीं देता और केवल उनके नाम से सभी गुण नक्शे करना होगा ।

देखें स्रोत कोड from XmlDeserializer:

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

खाते में सब से ऊपर लेते हुए यह स्पष्ट है क्यों यह इस लाइन के साथ अपने अनुरोध वस्तु में मेल खाने वाले नाम स्थान के बाद आप स्पष्ट रूप से सेट XmlNamespace संपत्ति काम करना शुरू किया:

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

Execute विधि ने नेमस्पेस को deserializer में कॉपी किया और यह उचित रूप से ऑब्जेक्ट करने के लिए एक्सएमएल मैप किया।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^