2011-07-19 18 views
6

के साथ डेटा पोस्ट करते समय किसी ऑब्जेक्ट को क्रमबद्ध करें मैंने हाल ही में एक REST सेवा का उपभोग करने के लिए RestSharp का उपयोग करना शुरू कर दिया है जो एक्सएमएल का उपयोग करता है।RestSharp

यह एक्सएमएल से ऑब्जेक्ट्स को ऑब्जेक्ट्स को कस्टम ऑब्जेक्ट्स के संग्रह में विलुप्त करने देता है। लेकिन मेरा सवाल यह है कि सेवा पर वापस पोस्ट करते समय को फिर से शुरू करने का सबसे अच्छा तरीका क्या है?

क्या मुझे LINQ-to-XML का पुनर्विक्रय करने के लिए उपयोग करना चाहिए? मैंने Serializeable विशेषता और SerializeToXml उपयोगिता फ़ंक्शन का उपयोग करने का प्रयास किया, लेकिन जब ऐसा होता है तो ऐसा लगता है कि यह RestSharp द्वारा किए गए deserializing को तोड़ने लगता है।

उत्तर

1

हाल के एक प्रोजेक्ट पर मैंने XElement (System.Xml.Linq असेंबली से) का उपयोग मैन्युअल रूप से मेरे अनुरोधों को बनाने के लिए किया था। हालांकि मेरे पास सौदा करने के लिए केवल कुछ हद तक संपत्तियां थीं। RestSharp ने वास्तविक समस्या हल की जो सर्वर से बड़े XML ग्राफ़ प्रतिक्रियाओं को deserializing था।

यदि आपका ऑब्जेक्ट मॉडल एक्सएमएल स्कीमा के विपरीत है तो आपको एक और ऑब्जेक्ट मॉडल बनाना होगा, और उस पर नक्शा बनाना होगा, बस कुछ लाइब्रेरी का उपयोग करके इसे स्वचालित रूप से क्रमबद्ध किया जा सकता है। उस स्थिति में आप स्कीमा पर मैन्युअल रूप से मैपिंग से बेहतर हो सकते हैं। हालांकि मेरी स्थिति अपेक्षाकृत सरल है

var request = new RestRequest(); 
request.RequestFormat = RequestFormat.Xml; 
request.XmlSerializer = new SuperXmlSerializer(); // optional override, implements ISerializer 
request.AddBody(person); // object serialized to XML using current XML serializer 
+0

आपके उत्तर के लिए धन्यवाद! यदि किसी वर्ग के नाम और गुणों के पास उनके एक्सएमएल तत्वों के समान नाम हैं, या फिर आप xml गुणों के माध्यम से .NET serialization का उपयोग कर रहे हैं और फिर XmlSerializer का उपयोग कर रहे हैं, तो RestSharp स्वचालित रूप से serialize कर सकते हैं? – Evan

1

RestSharp कुछ बुनियादी एक्सएमएल क्रमबद्धता, जो आप यदि आवश्यक हो तो ओवरराइड कर सकते हैं समर्थन करता है। उदाहरण के लिए, एक ही नोड नाम मैं इस प्रयोग किया जाता करने के लिए क्रमानुसार करने में सक्षम होने की यह उन्हें में डैश के साथ नोड्स deserialize को पाने के लिए, और उसके बाद:

[XmlElement(ElementName = "short-name")] 
[SerializeAs(Name = "short-name")] 
public string shortName { get; set; } 

तो, अपने उदाहरण में, क्रमबद्धता [XmlElement("elementName")] सम्मान नहीं करता। इसके बजाय, आपको [SerializeAs(Name = "elementName")] का उपयोग करने की आवश्यकता होगी।

मुझे इसे रेस्टशर्प प्रोजेक्ट में टेस्ट कोड के माध्यम से ट्रॉल करके मिला।

+1

धन्यवाद! क्या एक्सएमएल क्रमबद्धता में निर्मित [XmlElement ("elementname")] जैसे गुणों पर ध्यान देना है? या क्या कस्टम serialization का उपयोग करने की आवश्यकता होगी? – Evan

+1

यह नहीं करता है। मुझे गुणों से नफरत है :)। आपको ISerializer को कार्यान्वित करना होगा और उसे –

+0

@ जॉनशेहेन-रनस्कोप रे के लिए XmlSerializer के माध्यम से पास करना होगा: * "मुझे गुणों से नफरत है" * ऐसा लगता है कि आपने इसके बारे में अपना मन बदल दिया है ... मुझे लगता है कि रेस्टशर्प का वर्तमान संस्करण (105.2 .3.0) में [DeserializeAs] (https://github.com/restsharp/RestSharp/wiki/Deserialization) विशेषता शामिल है। और विजुअल स्टूडियो में ऑब्जेक्ट ब्राउज़र में, अब भी मुझे एक ** SerializeAs ** विशेषता दिखाई देती है जिसे [इस उत्तर] में संदर्भित किया गया है (http://stackoverflow.com/a/10726706/1497596)। – DavidRR

3

मैं मैं क्या जरूरत के सभी प्राप्त करने के लिए विशेषताओं का उपयोग करने में सक्षम है,:

+0

मुझे यह समाधान पसंद नहीं है क्योंकि यह मानक एक्सएमएल सीरियलाइजेशन जैसा नहीं है। – jhilden

1

RestSharp के लिए स्रोत कोड को देखने के बाद मैंने पाया कि वास्तव में System.Xml.Serialization.XmlSerializerDotNetXmlSerializer नामक रैपर में निर्मित है, इसका उपयोग डिफ़ॉल्ट रूप से नहीं किया जाता है। इसका उपयोग करने के लिए, बस निम्न पंक्ति जोड़ें:

var request = new RestRequest(); 
request.RequestFormat = RequestFormat.Xml; 
request.XmlSerializer = new DotNetXmlSerializer(); 
request.AddBody(someObject); 
संबंधित मुद्दे