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


88

.NET FrameworkにはSystem.Runtime.Serialization.Json.DataContractJsonSerializerSystem.Web.Script.Serialization.JavaScriptSerializerが同梱されており、どちらもJSONをデシリアライズします。これらのタイプのどちらを他のタイプよりもいつ選択するかをどのようにして知ることができますか?MSDNはそれらの相対的な利点が何であるかを明確にしません。

JSONを使用または放出するプロジェクトがいくつかあり、それぞれに対して選択されたクラスは、各プロジェクトの主要開発者の意見に依存しています。単純なものもあれば、JSONからのマネージ型の作成に関する複雑なロジックを持つものもあります(型はストリームに厳密にマッピングされません)が、速度は特に重視されず、1つは速度が必要です。少なくとも現時点では、WCFとのやり取りはありません。

私は別のライブラリに興味がありますが、誰かが私の質問にも答えてくれることを期待しています。


8
Json.Net json.codeplex.comを使用してください。シリアライゼーション/デシリアライゼーションプロセスをより細かく制御できます。
LB

使い方によって異なります。DataContractJsonSerializerはWCFでうまく機能する傾向があります。JavaScriptSerializerははるかに単純です。あなたは何をしようとしているのですか?
jrummell 2012

ServiceStack.JsonSerializerを使用してください-最速です。ただし、[ScriptIgnore]属性は考慮されません。必要ない場合は問題ありません。ここではそれについての長い議論を参照してください:stackoverflow.com/questions/9150920/...
オフェルカメレオンマン

18
なぜみんなが答えをコメントに入れるのですか?回答への投票やコメントへの回答が難しくなります。
Justin R.

3
@JustinR。おそらく、ここで1行に反対票を投じて「これはコメントであるべきだ」と言う警察のせいだろう。
nawfal 2014

回答:


68

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

JavaScriptSerializerは、匿名型(一方向)を含む任意の型をシリアライズでき、より順応性の高い方法でシリアライズします。WCFの「オートマジック」は失われますが、統合オプションは増えます。

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

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

2015-05-26更新:会社で商用ライセンス製品の使用が必要な場合、またはパフォーマンスの最後のすべてが必要な場合は、https://servicestack.net/も確認してください


2
2つの間のシリアル化パフォーマンスの違いは何ですか?同じ数の属性を持つ同じ数のエンティティをシリアル化するとしますか?
Adrian Salazar

20

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

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

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

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


2

個人的には、DataContractJsonSerializerオーバーエンジニアリングの悪臭だと思います。私はそれをスキップしてで行き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.