20

मेरे web method में, मुझे कुछ तृतीय पक्ष सी # इकाई वर्ग का ऑब्जेक्ट मिलता है। इकाई वर्ग कुछ भी नहीं है लेकिन DataContract है। यह इकाई वर्ग काफी जटिल है और इसमें विभिन्न प्रकार के गुण हैं, कुछ गुण संग्रह भी हैं। बेशक, उन लिंक किए गए प्रकार डेटाकंट्रैक्ट भी हैं।लिंक से एक्सएमएल वीएस एक्सएमएलएसरिएलाइज़र वीएस डाटाकंट्रैक्ट सर्राइज़र

मैं अपनी वेब सेवा के व्यावसायिक तर्क के हिस्से के रूप में उस डेटाकंट्रैक्ट इकाई को XML में क्रमबद्ध करना चाहता हूं। मैं DataContractSerializer सीधे (वेब ​​विधि में प्राप्त ऑब्जेक्ट पर) का उपयोग नहीं कर सकता क्योंकि एक्सएमएल स्कीमा पूरी तरह से अलग है। तो DataContractSerializer द्वारा जेनरेट किया गया एक्सएमएल स्कीमा के खिलाफ मान्य नहीं होगा।

मैं उस दृष्टिकोण को समाप्त करने में सक्षम नहीं हूं जिसे मुझे कार्यान्वयन के लिए पालन करना चाहिए। मैं कार्यान्वयन दृष्टिकोण निम्नलिखित के बारे में सोच सकता है:

  1. एक्सएमएल को LINQ - यह ठीक लग रहा है लेकिन मैं मैन्युअल रूप से वस्तु के प्रत्येक प्रकार के लिए एक्सएमएल पेड़ (अर्थात तत्वों या वर्ग उदाहरण के एक्सएमएल प्रतिनिधित्व) बनाने के लिए की जरूरत है। चूंकि कई इकाई वर्ग हैं और वे एक-दूसरे से जुड़े हुए हैं, मुझे लगता है कि एक्सएमएल तत्वों को मैन्युअल रूप से लिखने के लिए यह बहुत अधिक काम है। इसके अलावा, मुझे एक्सएमएल ट्री को संशोधित करना होगा और जब इकाई वर्ग कुछ नई संपत्ति पेश करता है। न केवल यह, कोड जहां मैं एक्सएमएल पेड़ उत्पन्न करता हूं, थोड़ा कमजोर दिखता है (कम से कम उपस्थिति में) और भविष्य में किसी अन्य डेवलपर द्वारा बनाए रखने/बदलने के लिए कठिन होगा; उसे यह समझने के लिए बहुत करीब से देखना होगा कि एक्सएमएल कैसे उत्पन्न होता है।

  2. XmlSerializer - मैं अपने ही इकाई वर्गों कि XML संरचना मैं चाहता हूँ प्रतिनिधित्व करते हैं लिख सकते हैं। अब, मुझे आने वाली वस्तु से अपने स्वयं के वर्गों के ऑब्जेक्ट में विवरण कॉपी करने की आवश्यकता है। तो यह अतिरिक्त काम है (कोड निष्पादित होने पर भी .NET के लिए!)। फिर मैं XML उत्पन्न करने के लिए अपने ऑब्जेक्ट पर XmlSerializer का उपयोग कर सकता हूं। इस मामले में, मुझे इकाई कक्षाएं बनाना होगा और जब भी तृतीय पक्ष इकाई संशोधित हो जाएगी, मुझे बस अपनी कक्षा में नई संपत्ति जोड़नी होगी। (XmlElement या XmlAttibute विशेषताओं के साथ)। लेकिन लोग इस पर DataContractSerializer की सलाह देते हैं और इसलिए मैं इसे अंतिम रूप देना नहीं चाहता हूं जब तक कि सभी पहलू मेरे लिए स्पष्ट न हों।

  3. DataContractSerializer - फिर यहाँ, मुझे लगता है मैं तीसरे पक्ष DataContracts पर कोई नियंत्रण नहीं के बाद से अपने ही इकाई वर्ग लिखने के लिए होगा। और मुझे आने वाली वस्तु से अपने स्वयं के वर्गों के ऑब्जेक्ट में विवरण कॉपी करने की आवश्यकता है। तो यह अतिरिक्त काम है। हालांकि, चूंकि DataContractSerializer एक्सएमएल विशेषताओं का समर्थन नहीं करता है, इसलिए मुझे IXmlSerializable लागू करना होगा और WriteXml विधि में आवश्यक एक्सएमएल उत्पन्न करना होगा। DataContractSerializer XmlSerializer से तेज़ है, लेकिन फिर तीसरे पक्ष की इकाई में परिवर्तन होने पर मुझे परिवर्तन (WriteXml में) को संभालना होगा।

सवाल:

  • किस तरीके से इस परिदृश्य प्रदर्शन भी विचार करने में सबसे अच्छा है?
  • क्या आप कुछ बेहतर दृष्टिकोण सुझा सकते हैं?
  • DataContractSerializer पर विचार करने लायक है (क्योंकि XmlSerilaizer पर बेहतर प्रदर्शन है) जब आने वाली इकाई वर्ग बदल सकती है?
  • क्या LINQ वास्तव में serialization के लिए उपयोग किया जाना चाहिए? या यह पूछताछ के अलावा अन्य चीजों के लिए वास्तव में अच्छा है?
  • क्या ऐसे मामलों में LINQ पर XmlSerializer को प्राथमिकता दी जा सकती है? यदि हां, क्यों?

उत्तर

9

मैं @Werner Strydom के उत्तर से सहमत हूं।

मैंने XmlSerializer का उपयोग करने का निर्णय लिया क्योंकि कोड बनाए रखने योग्य है और यह मुझे अपेक्षित प्रदर्शन प्रदान करता है। सबसे महत्वपूर्ण यह है कि यह मुझे XML संरचना पर पूर्ण नियंत्रण देता है। XmlSerializer के माध्यम से अपने आवश्यकता के अनुसार

मैं इकाई वर्गों (XML तत्वों के विभिन्न प्रकार का प्रतिनिधित्व) बनाया है और जड़ वर्ग का एक उदाहरण से पारित कर दिया (वर्ग मूल तत्व का प्रतिनिधित्व):

यह कैसे मैं मेरी समस्या हल है । एम संबंध: 1 के मामले में LINQ की

छोटे उपयोग

जहाँ भी मैं एक ही तत्व चाहता था (जैसे कि Employee) विशिष्ट नोड के अंतर्गत कई बार (माना Department), मैं प्रकार List<T> की संपत्ति की घोषणा की। जैसे public List<Employee> EmployeesDepartment कक्षा में। ऐसे मामलों में XmlSerializer ने Department नोड के तहत Employees (जो सभी Employee तत्वों का समूहकरण कर रहा है) नामक एक तत्व को स्पष्ट रूप से जोड़ा। XmlSerializer द्वारा उत्पन्न XElement (यानी एक्सएमएल) में हेरफेर करने के लिए XmlSerializer ने .NET ऑब्जेक्ट को क्रमबद्ध करने के बाद LINQ () का उपयोग किया था। LINQ का उपयोग करके, मैंने बस Employee नोड्स को सीधे Department नोड के नीचे रखा और Employees नोड को हटा दिया।

हालांकि, मुझे xmlSerializer और LINQ के संयोजन से अपेक्षित प्रदर्शन मिला।

डाउनसाइड यह है कि, मेरे द्वारा बनाए गए सभी वर्गों को सार्वजनिक होना चाहिए जब वे बहुत अच्छी तरह से आंतरिक हो सकते हैं!

DataContractSerializer और LINQ-to-XML क्यों नहीं?

  • DataContractSerializer (जब तक कि मैं IXmlSerializable लागू) Xml विशेषताओं का उपयोग करने की अनुमति नहीं देता है। types supported by DataContractSerializer देखें।
  • LINQ-to-XML (और IXmlSerializable भी) जटिल XML संरचना बनाते समय कोड को बेकार बनाता है और यह कोड निश्चित रूप से अन्य डेवलपर्स को बनाए रखने/बदलने के दौरान अपने सिर खरोंच कर देगा।

क्या कोई अन्य तरीका है?

  • हां। जैसा कि @ वर्नर स्ट्रॉडम द्वारा उल्लिखित है, आप XSD.exe या Xsd2Code जैसे टूल का उपयोग करके कक्षाएं बहुत अच्छी तरह से उत्पन्न कर सकते हैं और यदि आप परिणामस्वरूप कक्षाओं से खुश हैं तो सीधे उनके साथ काम करें।
7

मैं XmlSerializer चुनूंगा क्योंकि यह एक कस्टम स्कीमा के लिए सबसे अधिक रखरखाव योग्य है (मान लीजिए कि आपके पास एक्सएसडी है)। जब आप सिस्टम को विकसित कर लेंगे, तो अपने प्रदर्शन को पूरी तरह से जांचें और यह निर्धारित करें कि एक्सएमएल सीरियलाइजेशन समस्याएं पैदा कर रहा है या नहीं। यदि ऐसा है, तो आप इसे किसी ऐसे चीज़ से प्रतिस्थापित कर सकते हैं जिसके लिए अधिक काम की आवश्यकता है और यह देखने के लिए फिर से जांच करें कि कोई लाभ है या नहीं। लेकिन अगर एक्सएमएल क्रमबद्धता कोई मुद्दा नहीं है, तो आपके पास रखरखाव कोड है।

एक्सएमएल डेटा के एक छोटे स्निपेट को पार्स करने में लगने वाला समय डेटाबेस या बाहरी सिस्टम के साथ संवाद करने की तुलना में नगण्य हो सकता है। बड़ी मेमोरी (16 जीबी +) वाली प्रणालियों पर आप जीसी को .NET 4 और पहले (एक .NET 4.5 को हल करने का प्रयास करते हैं) में बाधा पा सकते हैं, खासकर जब आप बहुत बड़े डेटा सेट और स्ट्रीम के साथ काम करते हैं।

AutoMapper का उपयोग अपनी इकाइयों को XSD.EXE द्वारा बनाई गई वस्तुओं को मैप करने के लिए करें। यह वेब डिज़ाइन को प्रभावित किए बिना डेटाबेस डिज़ाइन को बदलने की अनुमति देगा।

LINQ से XML के बारे में बहुत अच्छी बात यह है कि XSD validation है। हालांकि, यह प्रदर्शन को प्रभावित करता है।

1

एक और विकल्प LINQ और प्रतिबिंब का उपयोग करना है ताकि आपकी ऑब्जेक्ट को XML पर क्रमबद्ध करने के लिए एक सामान्य वर्ग बनाया जा सके। इसका एक अच्छा उदाहरण http://primecoder.blogspot.com/2010/09/how-to-serialize-objects-to-xml-using.html पर पाया जा सकता है। मुझे यकीन नहीं है कि आपके एक्सएमएल को दिन के अंत में कैसा दिखना चाहिए, लेकिन यदि यह बहुत बुनियादी है तो यह चाल कर सकता है। आपको अपनी इकाई वर्गों को जोड़ने/निकालने/बदलने के गुणों के रूप में परिवर्तन करने की आवश्यकता नहीं होगी, और आप इसे अपने सभी ऑब्जेक्ट्स (और उपयोगिता डीएलएल में संग्रहीत अन्य परियोजनाओं) में उपयोग कर सकते हैं।

+0

लिंक साझा करने के लिए धन्यवाद। प्रदान किया गया समाधान मेरी समस्या के लिए उपयोगी नहीं है लेकिन यह LINQ का उपयोग करने के लिए एक और तरीका जानने में मदद करता है! – Learner