DataContractJsonSerializer ve JavaScriptSerializer arasındaki fark nedir?


88

.NET Framework , her ikisi de JSON'u de / serileştiren System.Runtime.Serialization.Json.DataContractJsonSerializer ve System.Web.Script.Serialization.JavaScriptSerializer ile birlikte gelir . Bu türlerden birini diğerine ne zaman seçeceğimi nasıl bilebilirim? MSDN, göreceli avantajlarının ne olduğunu netleştirmez.

JSON tüketen veya yayan birkaç projemiz var ve şimdiye kadar her biri için seçilen sınıf, her bir projedeki birincil geliştiricinin görüşüne bağlıydı. Bazıları basittir, ikisi JSON'dan yönetilen türler üretmeyle ilgili karmaşık mantığa sahiptir (türler akışlarla yakından eşleşmez) ancak hız üzerinde herhangi bir vurgu yoktur, biri hız gerektirir. Hiçbiri WCF ile etkileşime girmiyor, en azından şimdilik.

Alternatif kütüphanelerle ilgilenirken, birilerinin soruma da bir cevabı olabileceğini umuyorum.


8
Json.Net json.codeplex.com'u kullanın . Serileştirme / seriyi kaldırma işlemi üzerinde çok daha fazla kontrole sahip olacaksınız.
LB

Nasıl kullandığına bağlı. DataContractJsonSerializer, WCF ile iyi çalışma eğilimindedir. JavaScriptSerializer çok daha basittir. Ne yapmaya çalışıyorsun?
jrummell

ServiceStack.JsonSerializer kullanın - bu en hızlısıdır. Ancak [ScriptIgnore] niteliğine saygı göstermez. İhtiyacınız yoksa sorun değil. Bununla ilgili uzun tartışmayı burada görün: stackoverflow.com/questions/9150920/…
Ofer Zelig

18
Neden herkes cevaplarını yorumlara yazıyor? Cevaplara oy vermeyi veya yorum yapmayı zorlaştırıyor.
Justin R.

3
@JustinR. belki de buradaki bazı polisler yüzünden bir satır cevapları reddeden ve "bu bir yorum olmalı" diyecek.
nawfal

Yanıtlar:


68

DataContractJsonSerializer, serileştirilmiş türlerin genellikle DataContract özniteliği uygulanmış POCO sınıfları olduğu WCF istemci uygulamalarıyla birlikte kullanılmak üzere tasarlanmıştır. DataContract yok, serileştirme yok. WCF'nin eşleme mekanizması, göndermeyi ve almayı çok basitleştirir, ancak yalnızca platformunuz homojen ise. Farklı araç setlerinde karıştırmaya başlarsanız, programınız yana doğru gidebilir.

JavaScriptSerializer, anonim türler (tek yönlü) dahil olmak üzere her türü seri hale getirebilir ve bunu daha uyumlu bir şekilde yapar. WCF'nin "otomatik sihrini" kaybedersiniz, ancak daha fazla entegrasyon seçeneği elde edersiniz.

Yorumlardan da görebileceğiniz gibi, AJAX serileştirme için birçok seçenek var ve hız ve sürdürülebilirlik sorularınızı ele almak için, tüm ekiplerin ihtiyaçlarını karşılayan bir çözüm bulmak için bunları araştırmaya değer olabilir. Herkes işleri kendi yöntemleriyle yaptığı için uzun vadede sürdürülebilirlik sorunlarını azaltın.

2014-04-07 GÜNCELLEME: Mümkünse JSON.NET kullanmanızı öneririm. Bu soruda ele alınan 3 kitaplığın bir incelemesi için http://james.newtonking.com/json Özellik Karşılaştırması'na bakın .

2015-05-26 GÜNCELLEME: Şirketiniz ticari olarak lisanslanabilir ürünlerin kullanılmasını gerektiriyorsa veya her bir performansa ihtiyacınız varsa, https://servicestack.net/ adresini de kontrol etmek isteyebilirsiniz .


2
Nelerdir seri hale ikisi arasındaki performans farkları? Aynı sayıda özniteliğe sahip aynı sayıda varlığı seri hale getireceklerini varsayalım.
Adrian Salazar

20

Her ikisi de yaklaşık olarak aynı şeyi yapar, ancak çok farklı altyapı kullanır, böylece serileştirmek / serileştirmek istediğiniz sınıflar üzerinde farklı kısıtlamalar uygular ve serileştirme / seriyi kaldırma sürecini ayarlamada farklı derecelerde esneklik sağlar.

Çünkü atrtibute DataContractJsonSerializerkullanarak serileştirmek istediğiniz tüm sınıfları DataContractve DataMemberöznitelik kullanarak tüm üyeleri işaretlemelisiniz . Bazı sınıflarınızın enum üyeleri varsa, o zaman numaralandırmalar da DataContractve her bir enum üyesi olarak işaretlenmelidir - EnumMemberöznitelik ile. Ayrıca DataContractJsonSerializer, türlerin çözümleme mantığını değiştirerek ve serileştirdiğiniz türleri vekillerle değiştirerek tüm serileştirme / seriyi kaldırma işlemi üzerinde hassas denetim sağlar.

İçin JavaScriptSerializerjson dize nesneler deserializing planlıyorsanız size parametresiz yapıcı sağlamalısınız.

Benim için genellikle JavaScriptSerializerJson'da sayfayla birlikte ek ajax istekleri olmadan render etmek istediğim basit bir modelin olduğu sunum mantığını kullanıyorum . Ve hatta genellikle onları c # 'a geri almak zorunda kalmıyorum - bu yüzden hiçbir ek yük yok. Ancak, nesneleri daha sonra yüklemek için bir veri deposuna (genellikle sql depolaması olmayan) kaydetmek istediğim kalıcılık mantığı ise, DataContractJsonSerializeröznitelikleri koymanın ek yükü serileştirme / seriyi kaldırma işlemi ayarlamasında esnekliğe değer olduğundan kullanmayı tercih ederim. özellikle serileştirilmiş verilerin yeni sürümün nesnelerine güncellenmiş tanımlarla yüklenmesi söz konusu olduğunda


2

Şahsen, bunun DataContractJsonSerializeraşırı mühendislik kokusu olduğunu düşünüyorum . Atlar ve devam ederdim JavaScriptSerializer. Durumunda JavaScriptSerializermevcut değildir, kullanabileceğiniz FridayThe13th (p yazdığım bir kütüphane).


Json.Net her yerde. .Net 2.0, 3.5, 4.0, Silverlight, WindowsPhone
LB
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.