2010-01-30 7 views
14

मैं यह कैसे कर सकता हूं? या serializer स्वचालित रूप से रिकर्सन के साथ जाना होगा, और उन सभी बच्चों की वस्तुओं को एक्सएमएल में क्रमबद्ध करें?अन्य वर्गों (रिकर्सिव सीरियलाइजिंग?) की कक्षाओं को क्रमबद्ध करने के लिए कैसे करें

मुझे एक उदाहरण दें कि आप कक्षाओं को क्रमबद्ध कैसे करेंगे जिसमें अन्य वर्गों की वस्तुओं को स्वयं में शामिल किया जाएगा! यह इस सवाल का मूल था!

मैंने यह कोशिश की है, और यह लक्षित XML फ़ाइल में कुछ भी (XML शीर्षलेख को छोड़कर) आउटपुट नहीं किया।

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

public void SaveCurrent(string MapFileName) 
{ 
    string MapPath = world_.game_.Content.RootDirectory + "/Maps/" + MapFileName + ".xml"; 
    StreamWriter MapWriter = new StreamWriter(MapPath); 

    Map SavedMap = new Map(); 
    SavedMap.Entities = world_.Entities; 
    XmlSerializer xSerializer = new XmlSerializer(SavedMap.GetType()); 

    xSerializer.Serialize(MapWriter, SavedMap); 
    MapWriter.Close(); 
} 

यह कोड का टुकड़ा है जो क्रमबद्धता करता है।

public class Map 
{ 
    internal string MapName; 
    internal string MapDescription; 
    internal string MapAuthor; 
    public List<Entity> Entities = new List<Entity>(); 
} 

और यह वह वर्ग है जो धारावाहिक है। क्या सीरियलाइजेशन को एक ही असेंबली से बुलाया जाता है, तो आंतरिक को प्रकाशन के रूप में गिना जा सकता है? कोड SavedMap.GetType() फ़ंक्शन पर अपवाद फेंकता है, और मैंने typeof(Map) भी कोशिश की है, लेकिन सफलता के बिना। मुझे लगता है कि ऐसा इसलिए है क्योंकि मुझे प्रत्येक नई कक्षा (गहरी क्रमबद्धता) को संभालने के लिए किसी अन्य तरीके की आवश्यकता है, मैं यह कैसे कर सकता हूं?

इसके अलावा, मुझे कुछ उदाहरण मिल गए हैं कि कोई इंटरफ़ेस विरासत या विशेषता नहीं है, इसलिए मैंने उनको नहीं जोड़ा, लेकिन मैं IXmlSerializable का उपयोग करने की योजना बना रहा हूं, हालांकि मुझे नहीं पता कि कॉल कैसे करें WriteXML कार्यान्वयन के अंदर एक और serialization।

+0

आप क्या कोशिश की है की एक नमूना बता सकते हैं? –

+0

मुझे खेद है कि मैंने पहले ऐसा नहीं किया था। – Johnny

+0

"यदि आंतरिक समान विधानसभा से सीरियलाइजेशन कहा जाता है, तो क्या आंतरिक को प्रकाशन के रूप में गिना जा सकता है?" नहीं। XmlSerializer केवल सार्वजनिक सदस्यों को मानता है। (वास्तव में XmlSerializer कोड कि serialising और deserialising करता है धारण करने के लिए एक गतिशील विधानसभा बनाता है, इसलिए वास्तविक क्रमबद्धता * हमेशा * जगह एक अलग विधानसभा में अपने कोड से ले जाता है।) – itowlson

उत्तर

2

बारे प्रकार समस्या जोश आइंस्टीन mentionned, आप XmlInclude विशेषता के साथ काम करने की जरूरत नहीं है: आप भी serializer के प्रकारों की सूची पारित कर सकते हैं (हस्ताक्षर किया जा रहा XmlSerializer(Type baseType, Type[] extraTypes))। यह विशेष रूप से किया जाना चाहिए यदि समय के साथ अतिरिक्त प्रकार की सूची बढ़ने का मौका मिलता है।

अतिरिक्त प्रकार ढूँढना या तो प्रतिबिंब के माध्यम से वस्तु श्रृंखलाबद्ध किया जाना है या प्रतिबिंब से अधिक स्टार्टअप पर लोड विधानसभाओं पर किसी भी जरूरत प्रकार लाने के लिए किया जा सकता है।

संपादित करें: कच्चे उदाहरण:

public abstract class Animal 
{ 
} 

public class Dog : Animal 
{ 
} 

public class Cat : Animal 
{ 
} 

public static class AnimalSerializer 
{ 
    public static void Serialize(List<Animal> animals, Stream stream) 
    { 
     List<Type> animalTypes = new List<Type>(); 
     foreach (Animal animal in animals) 
     { 
      Type type = animal.GetType(); 
      if (!animalTypes.Contains(type)) 
      { 
       animalTypes.Add(type); 
      } 
     } 
     XmlSerializer serializer = new XmlSerializer(typeof(List<Animal>), animalTypes.ToArray()); 
     serializer.Serialize(stream, animals); 
    } 
} 
+0

यह एक और बात है जिसे मैंने देखा है और पूछना चाहता था! क्या आप एक उदाहरण साझा कर सकते हैं? – Johnny

+0

बस मुझे क्या चाहिए! धन्यवाद! – Johnny

3

यह पूरे ऑब्जेक्ट ग्राफ़ (ऑब्जेक्ट और किसी भी ऑब्जेक्ट को सार्वजनिक सदस्यों के माध्यम से उजागर करता है) को क्रमबद्ध करेगा, जब तक कि ग्राफ में सभी ऑब्जेक्ट्स क्रमबद्ध हों। धारावाहिक क्या है इसके लिए विभिन्न धारावाहिकों के अलग-अलग नियम हैं। उदाहरण के लिए XmlSerializer को एक डिफ़ॉल्ट सार्वजनिक कन्स्ट्रक्टर की आवश्यकता होती है।

इसके अलावा, एक्सएमएल सीरियलाइज़र को यह बताने में सक्षम होना चाहिए कि यह किस तरह के प्रकारों को केवल प्रकार की जानकारी और उन प्रकारों पर विशेषताओं के आधार पर क्रमबद्ध करेगा। तो उदाहरण के लिए कहें कि आपके पास एक कक्षा है जिसमें पशु प्रकार की संपत्ति है, फिर भी रनटाइम पर XmlSerializer को कुत्ते के प्रकार का एक वस्तु मिलती है। इसका समर्थन करने के लिए आपको XmlInclude विशेषता का उपयोग करने के लिए उस समय से पहले यह जानने की आवश्यकता होगी कि उसे कुत्ते का समर्थन करने की आवश्यकता है।

क्रमबद्ध आउटपुट के ऑब्जेक्ट ग्राफ़ के हिस्सों को रखने के लिए, आप XmlIgnore विशेषता का उपयोग करेंगे। विभिन्न धारावाहिकों में भी शामिल/अनदेखा करने के लिए अलग-अलग विशेषताएं हैं

आशा है कि इससे थोड़ा सा स्पष्टीकरण में मदद मिलेगी। आप this topic in MSDN पर भी पढ़ना चाहेंगे।

+0

क्या मैं कक्षा कार्यान्वयन पर [XmlIgnore] जोड़ सकता हूं? सूची में बहुरूपता के कारण मैं इनपुटकंपोनेंट ऑब्जेक्ट्स को अनदेखा नहीं कर सकता! – Johnny

+0

नहीं, विशेषता लक्ष्य केवल फ़ील्ड, प्रॉपर्टी, पैरामीटर, या रिटर्नवैल्यू पर XmlIgnore निर्दिष्ट करने की अनुमति देता है हालांकि मुझे यकीन नहीं है कि यह पिछले दो के साथ कैसे उपयोग किया जाएगा। – Josh

6

Serializable और XmlInclude अपनी कक्षा में जोड़ें:

[System.Serializable] 
[System.Xml.Serialization.XmlInclude(typeof(Entity))] 
public class Map 
{ 
    internal string MapName; 
    internal string MapDescription; 
    internal string MapAuthor; 
    public List<Entity> Entities = new List<Entity>(); 
} 

उपयोग:

System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(Map)); 
serializer.Serialize(mapWriter, savedMap); 
+1

अच्छा जवाब! '[सिस्टम.Serializable] [System.Xml.Serialization.XmlInclude (टाइपऑफ (इकाई))]' आपको वास्तव में XmlSerializer के साथ इसकी आवश्यकता नहीं है। पी। यह भी ध्यान रखें कि "सूची संस्थाएं" सूची होनी चाहिए, न कि सूची। – Alexanderius

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

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