2012-02-15 13 views
77

System.Runtime.Serialization.Json.DataContractJsonSerializer और System.Web.Script.Serialization.JavaScriptSerializer के साथ .NET Framework जहाजों, जिनमें से दोनों JSON को डी/क्रमबद्ध करते हैं। मुझे कैसे पता चलेगा कि इन प्रकारों में से किसी एक को दूसरे पर कब चुनना है? एमएसडीएन यह स्पष्ट नहीं करता है कि उनके रिश्तेदार फायदे क्या हैं।DataContractJsonSerializer और JavaScriptSerializer के बीच क्या अंतर है?

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

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

+8

जेसन.Net http://json.codeplex.com/ का उपयोग करें। धारावाहिक/deserialization प्रक्रिया पर आप अधिक नियंत्रण होगा। –

+0

इस पर निर्भर करता है कि आप इसका उपयोग कैसे कर रहे हैं। DataContractJsonSerializer डब्ल्यूसीएफ के साथ अच्छी तरह से काम करता है। जावास्क्रिप्ट Serializer बहुत आसान है। तुम क्या करने की कोशिश कर रहे हो? – jrummell

+0

ServiceStack.JsonSerializer का उपयोग करें - यह सबसे तेज़ है। लेकिन यह [ScriptIgnore] विशेषता का सम्मान नहीं करता है। यदि आपको इसकी आवश्यकता नहीं है तो कोई समस्या नहीं है। इसके बारे में यहां एक लंबी चर्चा देखें: http://stackoverflow.com/questions/9150920/preventing-stackoverflowexception-while-serializing-ef-object-graph-into-json –

उत्तर

57

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

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

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

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

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

+2

उनमें से दो के बीच * धारावाहिक * प्रदर्शन अंतर क्या हैं? आइए कहें कि वे समान संख्या में गुणों के साथ समान संख्या में इकाइयों को क्रमबद्ध करेंगे? –

2

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

+0

Json.Net हर जगह है। .NET 2.0, 3.5, 4.0, सिल्वरलाइट, विंडोजफोन –

18

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

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

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

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