2012-03-13 9 views
7

में नेमस्पेस के साथ काम करता है मुझे काम करने के लिए सर्विसस्टैक xml deserialization सबसे आसान तरीका है जब xml में नेमस्पेस होता है। हालांकि, मुझे प्राप्त XML में नामस्थान नहीं हैं। सबसे सरल कामकाजी उदाहरण:एक्सएमएल deserializing केवल xml

[Serializable] 
public class test 
{ 

} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     string xml="<test xmlns=\"http://schemas.datacontract.org/2004/07/\"></test>"; 
     var result = ServiceStack.Text.XmlSerializer.DeserializeFromString<test>(xml); 
    } 
} 

हालांकि, यह वही नहीं है जो मैं चाहता हूं। मैं निम्नलिखित deserialize करना चाहते हैं, मैं कई सेवाओं से प्राप्त के बाद से उस xml है:

string xml="<test></test>"; 

लेकिन है कि मुझे निम्न त्रुटि देता है:

DeserializeDataContract: Error converting type: Error in line 1 position 7. 
Expecting element 'test' from namespace 
'http://schemas.datacontract.org/2004/07/'.. 
Encountered 'Element' with name 'test', namespace ''. 

मैंने कोशिश की:

[Serializable] 
[XmlRoot("test", Namespace = "")] 
public class test 

मैं एक नया सीरिएलाइज़र नहीं बना सकता, क्योंकि ServiceStack.Text.XmlSerializer स्थिर है। मुझे या तो Microsoft XmlSerializer या ServiceStack (दोनों नहीं) चुनने की आवश्यकता है। मतलब: अगर मुझे काम करने के लिए यह सरल उदाहरण नहीं मिल रहा है तो मुझे सर्विसस्टैक पैकेज के अन्यथा बहुत उपयोगी हिस्से को छोड़ना होगा। आखिरी चीज जो मैं चाहता हूं वह आने वाली एक्सएमएल में कुछ डमी नेमस्पेस इंजेक्ट करना है।

उत्तर

23

ServiceStack एक्सएमएल क्रमानुसार करने नेट के XML DataContractSerializer का उपयोग करता नेमस्पेस आप या तो साथ एक रिक्त स्ट्रिंग पर नाम स्थान निर्धारित करने की आवश्यकता को दूर करने के:

[DataContract(Namespace="")] 
public class test { ... } 

लेकिन तब आप प्रत्येक प्रॉपर्टी के साथ धारावाहिक चाहते चिह्नित करने के लिए होगा [डेटामेम्बर] विशेषताएँ। एक बेहतर विकल्प है, अपने Assembly.cs फ़ाइल में जोड़ने और विधानसभा विशेषता के आधार पर एक सी # नेमस्पेस के अंतर्गत सभी प्रकार के लिए एक खाली नाम स्थान निर्दिष्ट करने के लिए है जैसे:

[assembly: ContractNamespace("", ClrNamespace = "MyServiceModel.DtoTypes")] 

नोट: यदि आप [Serializable] विशेषता को हटा सकते हैं - इसका उपयोग किसी भी सर्विसस्टैक के सीरियललाइज़र द्वारा नहीं किया जाता है। इसके अलावा सभी XmlSerializer विशेषताएँ [XmlRoot] बेकार हैं क्योंकि सर्विसस्टैक .NET के DataContractSerializer का उपयोग करता है जो माइक्रोसॉफ्ट के पहले XmlSerializer नहीं है।

+0

धन्यवाद! वह लापता लिंक था जिसकी मुझे ज़रूरत थी! मैं किसी भी तरह से सर्विसस्टैक के लिए इस तरह के सही दस्तावेज नहीं ढूंढ सकता ... – user1154148

+0

कोई कारण नहीं है कि आपने अपना स्वयं का एक्सएमएल deserializer नहीं लिखा है? माइक्रोसॉफ्ट को इस तरह के जादू सॉस कॉन्फ़िगरेशन की आवश्यकता होती है, ताकि यह आपके JSON serializer/deserializer के विपरीत काम कर सके, जो बस काम करता है। – JasonD

+0

@ जेसन डी हाँ मुझे अच्छे कारण के बिना एनआईएचिंग पसंद नहीं है और मैं एक्सएमएल का उपयोग नहीं करना पसंद करता हूं। एमएस का एक्सएमएल डीसीएस एक्सएमएल के लिए भी काफी प्रदर्शन करता है, इसके लिए आवश्यक प्रयासों के लिए बहुत कम लाभ होता है। – mythz