web-dev-qa-db-ja.com

DataContractJsonSerializerとJavaScriptSerializerの違いは何ですか?

.NET Frameworkには System.Runtime.Serialization.Json.DataContractJsonSerializer および System.Web.Script.Serialization.JavaScriptSerializer が付属しており、どちらもJSONを逆シリアル化します。これらのタイプの1つを他のタイプよりも選択する時期を知るにはどうすればよいですか? MSDNは、それらの相対的な利点が何であるかを明確にしません。

JSONを消費または送信するプロジェクトがいくつかあり、それぞれに選択されたクラスは、各プロジェクトのプライマリ開発者の意見に依存しています。いくつかは単純で、2つはJSONからマネージ型を生成することに関する複雑なロジックを持っています(型はストリームに密接にマッピングしません)が、速度を重視せず、1つは速度を必要とします。少なくとも現時点では、WCFとの対話はありません。

私は代替ライブラリに興味がありますが、誰かが私の質問への答えを持っているかもしれないことを望んでいます。

84
Justin R.

DataContractJsonSerializerは、シリアル化された型が通常DataContract属性が適用されたPOCOクラスであるWCFクライアントアプリケーションで使用するためのものです。 DataContractなし、シリアル化なし。 WCFのマッピングメカニズムにより、プラットフォームが同種の場合にのみ、送受信が非常に簡単になります。異なるツールセットでミキシングを開始すると、プログラムが横向きになる可能性があります。

JavaScriptSerializerは、匿名型(一方向)を含む任意の型をシリアル化でき、より適合した方法でシリアル化できます。 WCFの「自動魔法」は失われますが、統合オプションは増えます。

コメントでわかるように、AJAX=シリアル化には多くのオプションがあり、速度と保守性の問題に対処するには、それらを調査してソリューションを見つける価値があるかもしれませんすべてのチームのニーズを満たし、誰もが独自の方法で物事を行うため、長期的に保守性の問題を軽減します。

2014-04-07更新:可能であればJSON.NETを使用することをお勧めします。 http://james.newtonking.com/json この質問で検討されている3つのライブラリのレビューについては、機能の比較を参照してください。

2015-05-26更新:企業が商用ライセンス製品の使用を必要とする場合、またはパフォーマンスのすべての最後のビットが必要な場合は、 https://servicestack.net/ をチェックアウトすることもできます。

66
Bahri Gungor

どちらもほぼ同じですが、非常に異なるインフラストラクチャを使用しているため、シリアル化/逆シリアル化するクラスに異なる制限を適用し、シリアル化/逆シリアル化プロセスの調整にさまざまな柔軟性を提供します。

DataContractJsonSerializerの場合、DataContract属性を使用してシリアル化するすべてのクラスと、DataMember属性を使用するすべてのメンバーをマークする必要があります。一部のクラスに列挙メンバーがある場合と同様に、列挙もDataContractおよび各列挙メンバーにEnumMember属性でマークする必要があります。また、DataContractJsonSerializerを使用すると、型解決ロジックを変更し、シリアル化する型をサロゲートに置き換えることで、シリアル化/逆シリアル化のプロセス全体を細かく制御できます。

JavaScriptSerializerの場合、json文字列からオブジェクトをデシリアライズする予定がある場合は、パラメーターなしのコンストラクターを提供する必要があります。

私にとっては、通常、プレゼンテーションロジックでJavaScriptSerializerを使用します。ここでは、追加のajaxリクエストなしで、ページとともにJsonでレンダリングしたい単純なモデルがあります。そして、私は通常、それらをc#にデシリアライズする必要はありません。したがって、オーバーヘッドはまったくありません。しかし、オブジェクトをデータストア(通常は非SQLストレージ)に保存して、後で読み込むための永続ロジックの場合、属性を配置するオーバーヘッドはシリアル化の柔軟性に値するため、DataContractJsonSerializerを使用することを好みます。/deserializationプロセスの調整。特に、更新された定義を使用して、新しいバージョンのオブジェクトにシリアル化されたデータをロードする場合

20
achekh

個人的には、DataContractJsonSerializerが過剰なエンジニアリングを要求していると思います。スキップして、JavaScriptSerializerを使用します。 JavaScriptSerializerが利用できないイベントでは、 FridayThe13th (私が書いたライブラリ; p)を使用できます。

2
JP Richardson