2009-04-22 6 views
13

मैं तो जैसे बुनियादी वस्तुओं की एक जोड़ी कहते हैं:मैं पहले से जानने के बिना XML को deserialize कैसे करूं?

[Serializable] 
public class Base 
{ 

    public string Property1 { get; set; } 
    public int Property2 { get; set; } 
} 

[Serializable] 
public class Sub: Base 
{ 
    public List<string> Property3 { get; set; } 

    public Sub():base() 
    { 
     Property3 = new List<string>(); 
    }   
} 

और मैं उन्हें इतनी तरह क्रमानुसार:

Sub s = new Sub {Property1 = "subtest", Property2 = 1000}; 
s.Property3.Add("item 1"); 
s.Property3.Add("item 2"); 

XmlSerializer sFormater = new XmlSerializer(typeof(Sub)); 
using (FileStream fStream = new FileStream("SubData.xml", 
    FileMode.Create, FileAccess.Write, FileShare.None)) 
{ 
    sFormater.Serialize(fStream, s); 
} 

मैं उन्हें कैसे deserialize सकते हैं, ताकि मैं वापस सही वर्ग मिल सकता है?

के रूप में, मैं इस

XmlSerializer bFormater = new XmlSerializer(typeof (Base)); 
Base newBase; 
using (FileStream fStream = new FileStream("BaseData.xml", 
    FileMode.Open, FileAccess.Read, FileShare.Read)) 
{ 
    newBase = (Base) bFormater.Deserialize(fStream); 
} 

की तरह कुछ चाहते हैं सिवाय मैं इसे किसी भी वर्ग है कि बेस से उतरता है और सही श्रेणी का निर्माण किया जाएगा के लिए एक XML फ़ाइल पारित करने में सक्षम हो जाएगा चाहते हैं।

मुझे लगता है कि मैं एक्सएमएल के रूट नोड का नाम पढ़ सकता हूं और सही XmlSerializer बनाने के लिए स्विच स्टेटमेंट का उपयोग कर सकता हूं, लेकिन मैं सोच रहा था कि क्या कोई आसान तरीका है।

+0

ठीक है। बस चेक किया गया। यह एक अपवाद फेंक रहा है। आखिरी पैरा हटा दिया है। – Kirtan

+0

ठीक है, मेरी टिप्पणी हटा दी गई है क्योंकि यह अब और लागू नहीं होती है। – Ray

उत्तर

8

, व्युत्पन्न वर्ग के बारे में एक्सएमएल serializer बताने के लिए अपने आधार वर्ग पर [XmlInclude] विशेषता का उपयोग करें तो यह पता लगा सकते हैं कि क्या बनाने के लिए। आपका अंतिम कोड स्निपेट फिर सही तरीके से काम करना चाहिए।

+0

यह बहुत अच्छा काम करता है। धन्यवाद। – Ray

+1

एक अतिरिक्त बात, जब मैंने उप वर्ग को क्रमबद्ध किया, तो मुझे बेस क्लास (उप वर्ग नहीं) पर बनाए गए XmlSerializer के साथ ऐसा करने की आवश्यकता है। – Ray

+0

[सीरियलज़ेबल, एक्सएमएल शामिल (टाइपोफ (सब))] बेस क्लास पर –

9

आप एक्सएमएल फ़ाइल के रूट नोड पढ़ सकते हैं और एक स्विच बयान उपयोग करने के बजाय, तो आप इस तरह अपने कोड लिख सकते हैं -

Type yourType = Type.GetType("Your Type"); 
XmlSerializer xs = new XmlSerializer(yourType); 

मैं वहाँ किसी भी तरह से एक्सएमएल पढ़ने के अलावा अन्य है नहीं लगता है क्योंकि अगर आप इस प्रकार को नहीं जानते हैं, आप कुछ भी नहीं कर सकते हैं।

0

जहाँ तक मुझे पता है, ऐसा करने का कोई आसान तरीका नहीं है।

मैं व्यक्तिगत रूप से एक अधिक सामान्य समाधान पसंद करता हूं (क्योंकि मुझे अपने कोड में कई सारे वर्गों को क्रमबद्ध करना है): मूल्य के साथ क्रमबद्ध क्रमबद्ध नाम रखने के लिए।

आप कुछ जानकारी के लिए इस सवाल पर एक नज़र ले जा सकते हैं: Serialise to XML and include the type of the serialised object

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

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