2011-11-21 17 views
13

के साथ यादृच्छिक/अज्ञात प्रकारों को Deserialize मैं एक सेवा के साथ संवाद करने के लिए XmlSerializer का उपयोग कर रहा हूँ। यह एक नियमित एसओएपी सेवा नहीं है, इसका अपना एक्सएमएल ऑब्जेक्ट प्रकार है। उदाहरण के लिए, मैं <Capabilities> ऑब्जेक्ट के लिए पूछ सकता हूं, लेकिन यह <Exception> वापस कर सकता है। तो, दूसरे शब्दों में, मुझे यादृच्छिक XML दस्तावेज़ प्रकारों से निपटना होगा। हालांकि, मुझे पता है कि मुझे किस प्रकार से निपटना है।XmlSerializer

जो मैं करने की कोशिश कर रहा हूं वह इन दस्तावेज़ों को क्रमबद्ध/deserialize करने के लिए एक सामान्य दृष्टिकोण खोजने के लिए है। समस्या यह है कि XmlSerializer को सृजन चरण में प्रकार जानने की जरूरत है।

ये एक आम मूल तत्व में समाहित नहीं हैं, इसलिए एक आधार वर्ग बनाने और [XmlInclude] विशेषता का उपयोग कर इस मामले में काम नहीं करता है: के साथ मैन्युअल रूप से

[XmlInclude(typeof(Exception))] 
[XmlInclude(typeof(Capabilities))] 
public abstract class BaseClass 
{ 
    public BaseClass() 
    { 
    SchemaLocation = "test"; 
    } 

    [XmlAttribute("schemaLocation")] 
    public String SchemaLocation { get; set; } 
} 

[XmlRoot("Exception")] 
public class Exception : BaseClass 
{ 
    public Exception():base() 
    { 
    } 
    [XmlElement] 
    public String Message { set; get; } 
} 

[XmlRoot("Capabilities")] 
public class Capabilities : BaseClass 
{ 
    public Capabilities() : base() 
    {} 
    [XmlElement] 
    public String ServiceName { set; get; } 
} 

मेरे समाधान अब तक मूल तत्व की जांच करने के लिए है XmlReader, और उसके बाद XmlSerializer उदाहरण बनाने से पहले इसे सही प्रकार पर मैप करें।

क्या ऐसा करने का कोई बेहतर तरीका है?

+0

मुझे लगता है कि आपका रास्ता ठीक है। XmlSerializer आपके द्वारा वर्णित मॉडल के लिए बहुत अच्छी तरह से नहीं खेलता है। इसे और अधिक सामान्य रूप से करने के लिए कुछ युक्तियां हैं लेकिन वे रूट तत्व में encapsulated आपके 'बेस क्लास' पर निर्भर करते हैं। आप संभवतः अपने xml के आस-पास इस मूल तत्व को जोड़ सकते हैं और फिर इस विधि को लागू कर सकते हैं, या अपने XmlInclude का उपयोग कर सकते हैं। देखें http://www.codeproject.com/KB/XML/xmlserializerforunknown.aspx – wal

उत्तर

1

जैसा कि आपने बताया है कि जब आप सेवा के लिए अनुरोध करते हैं तो वापस आ सकता है। तो क्या आप जानते हैं कि किसी प्रकार के लिए अनुरोध किया गया है, तो सेवा केवल कुछ निश्चित प्रकार वापस लौटा सकती है?

मैं XmlSerializer Constructor (Type, Type[]) की कोशिश की है कि ... XmlSerializer वर्ग कि XML दस्तावेज़ों में निर्दिष्ट प्रकार की वस्तुओं को क्रमानुसार कर सकते हैं और किसी विशेष प्रकार की वस्तु में XML दस्तावेज़ों deserialize का एक नया उदाहरण आरंभीकृत। यदि कोई प्रॉपर्टी या फ़ील्ड एरे देता है, तो अतिरिक्त टाइप पैरामीटर उन ऑब्जेक्ट्स को निर्दिष्ट करता है जिन्हें सरणी में डाला जा सकता है।

+1

सही है, मैं कुछ प्रकार के पीछे, इसके 3-4 differnet प्रकार की उम्मीद कर सकते हैं। मैंने भाग्य के बिना (टाइप, टाइप []) के साथ कन्स्ट्रक्टर की कोशिश की है .. यह वास्तव में XmlIncludeAttribute का उपयोग करने जैसा ही है। – Oyvind