Apa perbedaan antara DataContractJsonSerializer dan JavaScriptSerializer?

88

.NET Framework dikirimkan dengan System.Runtime.Serialization.Json.DataContractJsonSerializer dan System.Web.Script.Serialization.JavaScriptSerializer , keduanya membatalkan / membuat serial JSON. Bagaimana saya tahu kapan harus memilih salah satu dari jenis ini di atas yang lain? MSDN tidak menjelaskan dengan jelas apa keuntungan relatifnya.

Kami memiliki beberapa project yang menggunakan atau mengeluarkan JSON, dan class yang dipilih untuk masing-masing project sejauh ini bergantung pada opini developer utama di setiap project. Beberapa sederhana, dua memiliki logika kompleks terkait pembuatan tipe terkelola dari JSON (tipe tidak memetakan secara dekat ke aliran) tetapi tidak memiliki penekanan pada kecepatan, yang satu membutuhkan kecepatan. Tidak ada yang berinteraksi dengan WCF, setidaknya sampai sekarang.

Sementara saya tertarik pada perpustakaan alternatif, saya berharap seseorang mungkin memiliki jawaban untuk pertanyaan saya juga.

Justin R.
sumber
8
gunakan Json.Net json.codeplex.com . Anda akan memiliki lebih banyak kendali atas proses serialisasi / deserialisasi.
LB
Tergantung bagaimana Anda menggunakannya. DataContractJsonSerializer cenderung bekerja dengan baik dengan WCF. JavaScriptSerializer jauh lebih sederhana. Apa yang sedang Anda coba lakukan?
jrummell
Gunakan ServiceStack.JsonSerializer - ini yang tercepat. Tapi itu tidak menghormati atribut [ScriptIgnore]. Bukan masalah jika Anda tidak membutuhkannya. Lihat diskusi panjang tentangnya di sini: stackoverflow.com/questions/9150920/…
Ofer Zelig
18
Mengapa semua orang memberikan jawaban mereka dalam komentar? Itu membuat sulit untuk memilih jawaban atau mengomentarinya.
Justin R.
3
@Tokopedia mungkin karena beberapa polisi di sini yang akan menolak satu baris jawaban dan berkata: "ini harus menjadi komentar".
nawfal

Jawaban:

68

DataContractJsonSerializer dimaksudkan untuk digunakan dengan aplikasi klien WCF di mana tipe serial biasanya adalah kelas POCO dengan atribut DataContract yang diterapkan padanya. Tidak ada DataContract, tidak ada serialisasi. Mekanisme pemetaan WCF membuat pengiriman dan penerimaan menjadi sangat sederhana, tetapi hanya jika platform Anda homogen. Jika Anda mulai mencampur dalam kumpulan alat yang berbeda, program Anda mungkin berjalan ke samping.

JavaScriptSerializer dapat membuat serialisasi jenis apa pun, termasuk jenis anonim (satu cara), dan melakukannya dengan cara yang lebih sesuai. Anda kehilangan "automagic" WCF, tetapi Anda mendapatkan lebih banyak opsi integrasi.

Seperti yang Anda lihat di komentar, ada banyak opsi di luar sana untuk serialisasi AJAX, dan untuk menjawab pertanyaan tentang kecepatan vs. pemeliharaan, mungkin ada baiknya menyelidiki mereka untuk menemukan solusi yang memenuhi kebutuhan semua tim, untuk mengurangi masalah pemeliharaan dalam jangka panjang karena setiap orang melakukan hal-hal dengan cara mereka sendiri.

2014-04-07 UPDATE: Saya sarankan menggunakan JSON.NET jika Anda bisa. Lihat http://james.newtonking.com/json Perbandingan Fitur untuk review dari 3 perpustakaan yang dipertimbangkan dalam pertanyaan ini.

2015-05-26 UPDATE: Jika perusahaan Anda memerlukan penggunaan produk yang dapat dilisensikan secara komersial, atau Anda membutuhkan kinerja terakhir, Anda mungkin juga ingin melihat https://servicestack.net/ .

Bahri Gungor
sumber
2
Apa perbedaan kinerja serialisasi di antara keduanya? Katakanlah mereka akan membuat serial jumlah entitas yang sama dengan jumlah atribut yang sama?
Adrian Salazar
20

Keduanya melakukan hal yang kurang lebih sama tetapi menggunakan infrastruktur yang sangat berbeda sehingga menerapkan batasan yang berbeda pada kelas yang ingin Anda serialisasi / deserialisasi dan memberikan tingkat fleksibilitas yang berbeda dalam menyesuaikan proses serialisasi / deserialisasi.

Untuk DataContractJsonSerializerAnda harus menandai semua kelas yang ingin Anda serialisasi menggunakan DataContractatrtibute dan semua anggota menggunakan DataMemberatribut. Seperti halnya jika beberapa kelas Anda memiliki anggota enum, enum juga harus ditandai sebagai DataContractdan setiap anggota enum - dengan EnumMemberatribut. Juga DataContractJsonSerializermemungkinkan Anda mengontrol dengan baik seluruh proses serialisasi / deserialisasi dengan mengubah logika resolusi jenis dan mengganti jenis yang Anda serialisasi dengan pengganti.

Karena JavaScriptSerializerAnda harus menyediakan konstruktor tanpa parameter jika Anda berencana melakukan deserialisasi objek dari string json.

Bagi saya, saya biasanya menggunakan JavaScriptSerializerlogika presentasi, di mana ada model sederhana yang ingin saya render di Json bersama dengan halaman, tanpa permintaan ajax tambahan. Dan saya bahkan biasanya tidak perlu men-deserialisasi mereka kembali ke c # - jadi tidak ada biaya tambahan sama sekali. Tetapi jika itu adalah logika ketekunan, di mana saya ingin menyimpan objek ke dalam penyimpanan data (biasanya penyimpanan tanpa sql), untuk memuatnya nanti, saya lebih suka menggunakan DataContractJsonSerializerkarena overhead penempatan atribut bernilai fleksibilitas dalam penyetelan proses serialisasi / deserialisasi, terutama saat memuat data serial ke dalam objek versi yang lebih baru, dengan definisi yang diperbarui

achekh
sumber
2

Secara pribadi, saya pikir itu DataContractJsonSerializerberbau rekayasa berlebihan. Saya akan melewatkannya dan pergi dengan JavaScriptSerializer. Jika JavaScriptSerializertidak tersedia, Anda dapat menggunakan FridayThe13th (perpustakaan yang saya tulis; p).

JP Richardson
sumber
Json.Net ada dimana-mana. .Net 2.0, 3.5, 4.0, Silverlight, WindowsPhone
LB