DataContractJsonSerializer और JavaScriptSerializer के बीच क्या अंतर है?


88

.NET फ्रेमवर्क सिस्टम System.Runtime.Serialization.Json.DataContractJsonSerializer और System । मुझे कैसे पता चलेगा कि इनमें से किसी एक को दूसरे पर कब चुनना है? MSDN यह स्पष्ट नहीं करता है कि उनके सापेक्ष लाभ क्या हैं।

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

जबकि मुझे वैकल्पिक पुस्तकालयों में दिलचस्पी है, मैं उम्मीद कर रहा हूं कि किसी को मेरे प्रश्न का उत्तर भी मिल सकता है।


8
Json.Net json.codeplex.com का उपयोग करें । आप क्रमांकन / deserialization प्रक्रिया पर अधिक नियंत्रण रखेंगे।
एलबी

निर्भर करता है कि आप इसका उपयोग कैसे कर रहे हैं। DataContractJsonSerializer WCF के साथ अच्छा काम करता है। JavaScriptSerializer बहुत सरल है। तुम क्या करने की कोशिश कर रहे हो?
jrummell

ServiceStack.JsonSerializer का उपयोग करें - यह सबसे तेज़ है। लेकिन यह [ScriptIgnore] विशेषता का सम्मान नहीं करता है। यदि आपको इसकी आवश्यकता नहीं है तो कोई समस्या नहीं है। इसके बारे में एक लंबी चर्चा यहाँ देखें: stackoverflow.com/questions/9150920/…
ओफ़र ज़ेलिग

18
हर कोई टिप्पणियों में अपना जवाब क्यों देता है? इससे उनके उत्तरों पर टिप्पणी करना या उन पर टिप्पणी करना कठिन हो जाता है।
जस्टिन आर।

3
@JustinR। शायद यहाँ कुछ पुलिस के कारण जो एक पंक्ति के उत्तरों को कम कर देगी और कहेगी: "यह एक टिप्पणी होनी चाहिए"।
नवफाल

जवाबों:


68

DataContractJsonSerializer WCF क्लाइंट अनुप्रयोगों के साथ उपयोग करने के लिए अभिप्रेत है जहां क्रमबद्ध प्रकार आमतौर पर POCO वर्ग होते हैं जिनके साथ DataContract विशेषता लागू होती है। कोई DataContract, कोई क्रमांकन नहीं। WCF का मानचित्रण तंत्र भेजने और प्राप्त करने को बहुत सरल बनाता है, लेकिन केवल अगर आपका मंच सजातीय है। यदि आप अलग-अलग टूलसेट में मिश्रण करना शुरू करते हैं, तो आपका प्रोग्राम बग़ल में जा सकता है।

JavaScriptSerializer गुमनाम प्रकारों (एक तरह से) सहित किसी भी प्रकार को क्रमबद्ध कर सकता है, और अधिक अनुरूप तरीके से ऐसा करता है। आप WCF के "ऑटोमैजिक" खो देते हैं, लेकिन आप अधिक एकीकरण विकल्प प्राप्त करते हैं।

जैसा कि आप टिप्पणियों द्वारा देख सकते हैं, AJAX क्रमांकन के लिए बहुत सारे विकल्प हैं, और आपकी गति बनाम अनुरक्षण सवालों को संबोधित करने के लिए, यह एक समाधान खोजने के लिए उनकी जांच के लायक हो सकता है जो सभी टीमों की जरूरतों को पूरा करता है, लंबी अवधि में स्थिरता के मुद्दों को कम करें क्योंकि हर कोई चीजों को अपने तरीके से करता है।

2014-04-07 अद्यतन: यदि आप कर सकते हैं तो मैं JSON.NET का उपयोग करने का सुझाव देता हूं। Http://james.newtonking.com/json फ़ीचर देखें इस प्रश्न पर विचार किए गए 3 पुस्तकालयों की समीक्षा के लिए।

2015-05-26 अपडेट: यदि आपकी कंपनी को व्यावसायिक रूप से लाइसेंस प्राप्त उत्पादों के उपयोग की आवश्यकता है, या आपको हर अंतिम प्रदर्शन की आवश्यकता है, तो आप https://servicestack.net/ की भी जांच कर सकते हैं ।


2
उन दोनों के बीच क्रमिक प्रदर्शन के अंतर क्या हैं ? वे कहते हैं कि वे समान संख्या में विशेषताओं के साथ समान संख्या में अनुक्रमित करेंगे?
एड्रियन सलाजार

20

दोनों लगभग समान हैं लेकिन बहुत अलग बुनियादी ढांचे का उपयोग करते हुए इस प्रकार उन वर्गों पर अलग-अलग प्रतिबंध लागू करते हैं जिन्हें आप क्रमबद्ध / deserialize करना चाहते हैं और क्रमांकन / deserialization प्रक्रिया को ट्यूनिंग करने में अलग-अलग डिग्री प्रदान करते हैं।

इसके लिए DataContractJsonSerializerआपको उन सभी वर्गों को चिह्नित करना होगा DataContractजिन्हें आप एट्रीब्यूट का उपयोग करके क्रमबद्ध करना चाहते हैं और सभी सदस्य DataMemberविशेषता का उपयोग कर रहे हैं। साथ ही साथ अगर आपमें से कुछ वर्गों के पास एनुम सदस्य हैं, तो एनाम को भी DataContractऔर प्रत्येक एनुम सदस्य के रूप में चिह्नित किया जाना चाहिए - EnumMemberविशेषता के साथ । इसके अलावा, DataContractJsonSerializerआप प्रकार रिज़ॉल्यूशन लॉजिक में परिवर्तन करके और सरोगेट्स के साथ आपके द्वारा वर्गीकृत किए गए प्रकारों को बदलने के द्वारा क्रमांकन / deserialization की पूरी प्रक्रिया पर ठीक नियंत्रण की अनुमति देता है।

यदि JavaScriptSerializerआप जैसन स्ट्रिंग से वस्तुओं को नष्ट करने की योजना बनाते हैं, तो आपको पैरामीटर रहित निर्माता प्रदान करना होगा।

मेरे लिए, मैं आमतौर पर JavaScriptSerializerप्रेजेंटेशन लॉजिक में उपयोग करता हूं , जहां एक सरल मॉडल है जिसे मैं पेज पर एक साथ प्रस्तुत करना चाहता हूं, अतिरिक्त अजाक्स अनुरोध के बिना। और मैं भी आमतौर पर उन्हें वापस ग # करने के लिए deserialize नहीं है - तो वहाँ कोई उपरि है। लेकिन अगर यह दृढ़ता का तर्क है, जहां मैं वस्तुओं को एक डेटा स्टोर (आमतौर पर कोई-वर्ग भंडारण) में सहेजना चाहता हूं, तो उन्हें बाद में लोड करने के लिए, मैं उपयोग करना पसंद करता हूं DataContractJsonSerializerक्योंकि विशेषताओं को डालने का ओवरहेड क्रमांकन / डीसेरलाइज़ेशन प्रक्रिया में लचीलापन के लायक है। विशेष रूप से जब यह अद्यतन परिभाषाओं के साथ नए संस्करण की वस्तुओं में क्रमबद्ध डेटा को लोड करने की बात आती है


2

व्यक्तिगत रूप से, मुझे लगता है कि DataContractJsonSerializerओवर-इंजीनियरिंग का पुनर्मिलन। मैं इसे छोड़ कर जाऊंगा JavaScriptSerializer। उस स्थिति में जहां JavaScriptSerializerआप उपलब्ध नहीं हैं, आप शुक्रवार का उपयोग कर सकते हैं ।13 वां (एक पुस्तकालय जो मैंने लिखा था; पी)।


Json.Net हर जगह है। .नेट 2.0, 3.5, 4.0, सिल्वरलाइट, विंडोजफोन
एलबी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.