.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.
sumber
Jawaban:
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/ .
sumber
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
DataContractJsonSerializer
Anda harus menandai semua kelas yang ingin Anda serialisasi menggunakanDataContract
atrtibute dan semua anggota menggunakanDataMember
atribut. Seperti halnya jika beberapa kelas Anda memiliki anggota enum, enum juga harus ditandai sebagaiDataContract
dan setiap anggota enum - denganEnumMember
atribut. JugaDataContractJsonSerializer
memungkinkan Anda mengontrol dengan baik seluruh proses serialisasi / deserialisasi dengan mengubah logika resolusi jenis dan mengganti jenis yang Anda serialisasi dengan pengganti.Karena
JavaScriptSerializer
Anda harus menyediakan konstruktor tanpa parameter jika Anda berencana melakukan deserialisasi objek dari string json.Bagi saya, saya biasanya menggunakan
JavaScriptSerializer
logika 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 menggunakanDataContractJsonSerializer
karena 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 diperbaruisumber
Secara pribadi, saya pikir itu
DataContractJsonSerializer
berbau rekayasa berlebihan. Saya akan melewatkannya dan pergi denganJavaScriptSerializer
. JikaJavaScriptSerializer
tidak tersedia, Anda dapat menggunakan FridayThe13th (perpustakaan yang saya tulis; p).sumber