DataContractJsonSerializer และ JavaScriptSerializer แตกต่างกันอย่างไร


88

.NET Framework มาพร้อมกับSystem.Runtime.Serialization.Json.DataContractJsonSerializerและSystem.Web.Script.Serialization.JavaScriptSerializerซึ่งทั้งสองอย่างนี้จะยกเลิก / ซีเรียลไลซ์ JSON ฉันจะรู้ได้อย่างไรว่าควรเลือกประเภทใดประเภทหนึ่งเหล่านี้ทับอีกประเภทหนึ่ง MSDN ไม่ได้ระบุชัดเจนว่าข้อดีของมันคืออะไร

เรามีโปรเจ็กต์หลายโปรเจ็กต์ที่ใช้หรือปล่อย JSON และคลาสที่เลือกไว้สำหรับแต่ละโปรเจ็กต์นั้นขึ้นอยู่กับความคิดเห็นของผู้พัฒนาหลักในแต่ละโปรเจ็กต์ บางอย่างเรียบง่ายสองมีตรรกะที่ซับซ้อนเกี่ยวกับการสร้างประเภทที่มีการจัดการจาก JSON (ประเภทไม่ได้จับคู่กับสตรีมอย่างใกล้ชิด) แต่ไม่ได้เน้นเรื่องความเร็ว แต่อย่างใดประเภทหนึ่งต้องการความเร็ว ไม่มีการโต้ตอบกับ WCF อย่างน้อย ณ ตอนนี้

ในขณะที่ฉันสนใจห้องสมุดทางเลือก แต่ฉันก็หวังว่าจะมีคนตอบคำถามของฉัน


8
ใช้ Json.NET json.codeplex.com คุณจะควบคุมกระบวนการซีเรียลไลเซชั่น / ดีซีเรียลไลเซชันได้มากขึ้น
ปอนด์

ขึ้นอยู่กับว่าคุณใช้มันอย่างไร DataContractJsonSerializer มีแนวโน้มที่จะทำงานได้ดีกับ WCF JavaScriptSerializer นั้นง่ายกว่ามาก คุณพยายามจะทำอะไร?
jrummell

ใช้ ServiceStack.JsonSerializer - เร็วที่สุด แต่มันไม่ใช้แอตทริบิวต์ [ScriptIgnore] ไม่ใช่ปัญหาหากคุณไม่ต้องการ ดูการอภิปรายยาว ๆ ได้ที่นี่: stackoverflow.com/questions/9150920/…
Ofer Zelig

18
ทำไมทุกคนถึงใส่คำตอบในความคิดเห็น? ทำให้ยากที่จะโหวตคำตอบหรือแสดงความคิดเห็น
Justin R.

3
@ จัสตินอาร์. อาจเป็นเพราะตำรวจบางคนที่นี่ที่จะลงคะแนนคำตอบหนึ่งบรรทัดและพูดว่า: "นี่ควรเป็นความคิดเห็น"
nawfal

คำตอบ:


68

DataContractJsonSerializer มีไว้สำหรับใช้กับแอปพลิเคชันไคลเอนต์ WCF ซึ่งโดยทั่วไปแล้วประเภทซีเรียลไลซ์จะเป็นคลาส POCO ที่มีการใช้แอตทริบิวต์ DataContract ไม่มี DataContract ไม่มีการทำให้เป็นอนุกรม กลไกการทำแผนที่ของ WCF ทำให้การส่งและรับทำได้ง่ายมาก แต่ก็ต่อเมื่อแพลตฟอร์มของคุณเป็นเนื้อเดียวกัน หากคุณเริ่มผสมในชุดเครื่องมือต่างๆโปรแกรมของคุณอาจไปด้านข้าง

JavaScriptSerializer สามารถทำให้เป็นอนุกรมประเภทใดก็ได้รวมถึงประเภทที่ไม่ระบุตัวตน (ทางเดียว) และทำในลักษณะที่สอดคล้องกัน คุณสูญเสีย "automagic" ของ WCF แต่คุณได้รับตัวเลือกการผสานรวมเพิ่มเติม

ดังที่คุณเห็นจากความคิดเห็นมีตัวเลือกมากมายสำหรับการทำให้เป็นอนุกรม AJAX และเพื่อตอบคำถามเกี่ยวกับความเร็วเทียบกับการบำรุงรักษาอาจคุ้มค่าที่จะตรวจสอบพวกเขาเพื่อหาวิธีแก้ปัญหาที่ตรงกับความต้องการของทุกทีม ลดปัญหาการบำรุงรักษาในระยะยาวเนื่องจากทุกคนทำในแบบของตัวเอง

2014-04-07 อัปเดต: ฉันแนะนำให้ใช้ JSON.NET ถ้าคุณทำได้ ดูhttp://james.newtonking.com/jsonการเปรียบเทียบคุณลักษณะสำหรับการทบทวนไลบรารี 3 แห่งที่พิจารณาในคำถามนี้

2015/05/26 UPDATE: หาก บริษัท ของคุณต้องใช้ผลิตภัณฑ์ที่ออกใบอนุญาตได้ในเชิงพาณิชย์หรือคุณต้องการให้ทุกบิตสุดท้ายของการทำงานคุณอาจต้องการตรวจสอบhttps://servicestack.net/


2
อะไรคือความแตกต่างของประสิทธิภาพการทำให้เป็นอนุกรมระหว่างสองตัวนี้? สมมติว่าพวกเขาจะทำให้เป็นอนุกรมของเอนทิตีจำนวนเดียวกันด้วยจำนวนแอตทริบิวต์เดียวกันหรือไม่?
Adrian Salazar

20

ทั้งสองทำเหมือนกันโดยประมาณ แต่ใช้โครงสร้างพื้นฐานที่แตกต่างกันมากดังนั้นจึงใช้ข้อ จำกัด ที่แตกต่างกันในคลาสที่คุณต้องการทำให้เป็นอนุกรม / ดีซีเรียลไลซ์และให้ความยืดหยุ่นในระดับที่แตกต่างกันในการปรับแต่งกระบวนการทำให้เป็นอนุกรม / การแยกส่วน

สำหรับDataContractJsonSerializerคุณต้องทำเครื่องหมายคลาสทั้งหมดที่คุณต้องการทำให้เป็นอนุกรมโดยใช้DataContractatrtibute และสมาชิกทั้งหมดโดยใช้DataMemberแอตทริบิวต์ เช่นเดียวกับในกรณีที่บางชั้นเรียนของคุณมีสมาชิก enum ดังนั้น enum จะต้องถูกทำเครื่องหมายเป็นDataContractและสมาชิก enum แต่ละคนด้วยEnumMemberแอตทริบิวต์ ยังDataContractJsonSerializerช่วยให้คุณสามารถควบคุมกระบวนการทั้งหมดของการทำให้เป็นอนุกรม / การดีซีเรียลไลเซชันโดยการเปลี่ยนตรรกะความละเอียดประเภทและแทนที่ประเภทที่คุณทำให้เป็นอนุกรมกับตัวแทน

สำหรับJavaScriptSerializerคุณต้องจัดเตรียมคอนสตรัคเตอร์แบบไม่มีพารามิเตอร์หากคุณวางแผนที่จะแยกอ็อบเจ็กต์จากสตริง json

สำหรับฉันฉันมักจะใช้JavaScriptSerializerในตรรกะการนำเสนอซึ่งมีโมเดลง่ายๆที่ฉันต้องการแสดงใน Json ร่วมกับเพจโดยไม่ต้องร้องขอ ajax เพิ่มเติม และโดยปกติฉันไม่จำเป็นต้อง deserialize กลับไปที่ c # - ดังนั้นจึงไม่มีค่าใช้จ่ายใด ๆ เลย แต่ถ้าเป็นตรรกะการคงอยู่ที่ฉันต้องการบันทึกวัตถุลงในที่เก็บข้อมูล (โดยปกติจะไม่มีพื้นที่เก็บข้อมูล sql) เพื่อโหลดในภายหลังฉันชอบใช้DataContractJsonSerializerเพราะค่าใช้จ่ายในการใส่แอตทริบิวต์นั้นคุ้มค่ากับความยืดหยุ่นในการปรับแต่งกระบวนการซีเรียลไลเซชัน / ดีซีเรียลไลเซชัน โดยเฉพาะอย่างยิ่งเมื่อเป็นเรื่องของการโหลดข้อมูลซีเรียลลงในวัตถุของเวอร์ชันที่ใหม่กว่าพร้อมคำจำกัดความที่อัปเดต


2

โดยส่วนตัวแล้วฉันคิดว่าDataContractJsonSerializerการทำ over-engineering JavaScriptSerializerฉันข้ามมันและไปกับ ในกรณีที่JavaScriptSerializerไม่สามารถใช้งานได้คุณสามารถใช้FridayThe13th (ห้องสมุดที่ฉันเขียน; p)


Json.Net มีอยู่ทั่วไป .Net 2.0, 3.5, 4.0, Silverlight, WindowsPhone
LB
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.