2009-06-19 17 views
5

मैं 3 वर्गोंXmlSerializer.Serialize अस्पष्ट

  • कार
  • रेडियो है कि परीक्षण के आवेदन बनवाने के
  • sportcar: कार (एक रेडियो)

serialize प्रक्रिया जब जैसा कि मैंने XmlSerializer वस्तु का उदाहरण बनाने मैं

XmlSerializer xmlSerializer = new XmlSerializer(typeof(SportCar)); 
का परीक्षण करने के लिए 2 ऑब्जेक्ट का उपयोग

और

XmlSerializer xmlSerializer = new XmlSerializer(
    typeof(SportCar), 
    new Type[] { typeof(Car), typeof(Radio) }); 

यह 2 दृष्टिकोण का परिणाम समान है, इसलिए मुझे पता है कि इन 2 निर्माता या महत्वपूर्ण बिंदु # 2 निर्माता उपयोग करने की आवश्यकता है कि बीच का अंतर क्या है करना चाहते हैं? इधर, अतिरिक्त जानकारी के बिना

XmlSerializer xmlSerializer = new XmlSerializer(typeof(Car), 
    new Type[] { typeof(SportCar), typeof(Radio) }); 

अगर पता नहीं चल पाता है (बस Car से) या तो के बारे में SportCar: उदाहरण के लिए -

उत्तर

8

बड़ा अंतर है जब आप XmlSerializer के बारे में उप कक्षाएं बताने की आवश्यकता है या Radio - इसलिए यदि आप इसे एक वस्तु वास्तव में एक SportCar है कि देने के लिए, यह विफल हो जाएगा:

Car car = new SportCar {...}; 
xmlSerializer.Serialize(destination, car); 

तुम भी ऐसा कर सकते हैं Car प्रकार परिभाषा के खिलाफ [XmlInclude(typeof(SportCar))] की स्थापना:

[XmlInclude(typeof(SportCar))] 
public class Car {...} 

यह आसान है, लेकिन अगर Car प्रकार एक विधानसभा कि SportCar के बारे में जानता है ही संभव है। लेकिन आप अक्सर करते हैं इसे जानें, इसलिए XmlInclude पसंदीदा विकल्प है।

इसके अतिरिक्त: वहाँ XmlInclude के कुछ दक्षता लाभ कर रहे हैं; दृश्यों के पीछे प्रणाली XmlSerializer कुशल बनाने के लिए गतिशील प्रकार की पीढ़ी का उपयोग करती है। इस कारण से, आपको आम तौर पर XmlSerializer इंस्टेंस बनाने के लिए (और पुनः उपयोग) रखना चाहिए; उदाहरण के लिए, इसे स्थिर क्षेत्र में संग्रहीत करके। हालांकि, यह सिस्टम स्वचालित रूप से डिफ़ॉल्ट उपयोग (new XmlSerializer(typeof(Car))) के लिए करता है - यानी कोई फर्क नहीं पड़ता कि आप इस कन्स्ट्रक्टर का कितनी बार उपयोग करते हैं, यह केवल एक बार गतिशील कोड उत्पन्न करता है। यदि आप अधिक जटिल कन्स्ट्रक्टर (new XmlSerializer(typeof(Car),new Type[] { typeof(SportCar), typeof(Radio) })) का उपयोग करते हैं तो यह प्रत्येक बार टाइप जनरेशन करेगा।

+0

यदि मैं उप श्रेणी की जानकारी निर्दिष्ट करता हूं तो आउटपुट में क्या अंतर है? (मैं Serialize प्रक्रिया के लिए नया हूँ) – Anonymous

+1

XmlInclude दृष्टिकोण और कन्स्ट्रक्टर (नया प्रकार []) दृष्टिकोण का उपयोग करने के बीच आउटपुट में कोई अंतर नहीं है; वे बराबर हैं। यदि आप न तो करते हैं, और XmlSerializer (टाइपऑफ (कार)) के लिए पूछते हैं, लेकिन इसे स्पोर्टकार दें - यह एक अपवाद फेंक देगा। –

+0

मैं देखता हूं, XmlSerializer के बारे में विषय संक्षेप में सी # 3.0 पर पढ़ने के बाद और "उत्तर वर्गों" के बारे में उल्लेख करने वाले आपके उत्तर को पढ़ने के लिए यह मुझे समझता है कि XmlSerializer कैसे काम करता है। (मैं सी # पर अध्ययन करने के लिए एक और किताब खरीदता हूं, बहुत बुरा।) – Anonymous

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