Was ist der Unterschied zwischen DataContractJsonSerializer und JavaScriptSerializer?

88

Das .NET Framework wird mit System.Runtime.Serialization.Json.DataContractJsonSerializer und System.Web.Script.Serialization.JavaScriptSerializer geliefert , die beide JSON de / serialisieren. Woher weiß ich, wann ich einen dieser Typen dem anderen vorziehen muss? MSDN macht nicht klar, welche relativen Vorteile sie haben.

Wir haben mehrere Projekte, die JSON verbrauchen oder emittieren, und die Klasse, die bisher für jedes ausgewählt wurde, hing von der Meinung des primären Entwicklers zu jedem Projekt ab. Einige sind einfach, zwei haben eine komplexe Logik hinsichtlich der Erstellung verwalteter Typen aus JSON (die Typen sind nicht eng mit den Streams verknüpft), legen jedoch keinen Wert auf Geschwindigkeit, einer erfordert Geschwindigkeit. Zumindest ab sofort interagiert keiner mit WCF.

Während ich mich für alternative Bibliotheken interessiere, hoffe ich, dass jemand auch eine Antwort auf meine Frage hat.

Justin R.
quelle
8
Verwenden Sie Json.Net json.codeplex.com . Sie haben viel mehr Kontrolle über den Serialisierungs- / Deserialisierungsprozess.
LB
Kommt darauf an, wie du es benutzt. DataContractJsonSerializer funktioniert in der Regel gut mit WCF. JavaScriptSerializer ist viel einfacher. Was versuchst du zu machen?
Jrummell
Verwenden Sie ServiceStack.JsonSerializer - es ist das schnellste. Das Attribut [ScriptIgnore] wird jedoch nicht berücksichtigt. Kein Problem, wenn Sie es nicht brauchen. Sehen Sie eine lange Diskussion darüber hier: stackoverflow.com/questions/9150920/…
Ofer Zelig
18
Warum geben alle ihre Antworten in Kommentare ein? Es macht es schwierig, über die Antworten abzustimmen oder sie zu kommentieren.
Justin R.
3
@ JustinR. Vielleicht wegen einer Polizei hier, die einzeilige Antworten ablehnen und sagen würde: "Dies sollte ein Kommentar sein".
Nawfal

Antworten:

68

Der DataContractJsonSerializer ist für die Verwendung mit WCF-Clientanwendungen vorgesehen, bei denen die serialisierten Typen normalerweise POCO-Klassen sind, auf die das DataContract-Attribut angewendet wird. Kein Datenvertrag, keine Serialisierung. Der Mapping-Mechanismus von WCF macht das Senden und Empfangen sehr einfach, aber nur, wenn Ihre Plattform homogen ist. Wenn Sie verschiedene Toolsets einmischen, wird Ihr Programm möglicherweise seitwärts verschoben.

Der JavaScriptSerializer kann jeden Typ, einschließlich anonymer Typen (in eine Richtung), serialisieren und dies auf konformere Weise. Sie verlieren die "Automagik" von WCF, erhalten aber mehr Integrationsoptionen.

Wie Sie den Kommentaren entnehmen können, gibt es viele Optionen für die AJAX-Serialisierung. Um Ihre Fragen zu Geschwindigkeit und Wartbarkeit zu beantworten, sollten Sie sie untersuchen, um eine Lösung zu finden, die den Anforderungen aller Teams entspricht Reduzieren Sie langfristig die Wartbarkeitsprobleme, da jeder die Dinge auf seine eigene Weise erledigt.

07.04.2014 UPDATE: Ich schlage vor, JSON.NET zu verwenden, wenn Sie können. Unter http://james.newtonking.com/json Funktionsvergleich finden Sie eine Übersicht über die drei in dieser Frage berücksichtigten Bibliotheken.

2015-05-26 UPDATE: Wenn Ihr Unternehmen die Verwendung von kommerziell lizenzierbaren Produkten benötigt oder Sie die letzte Leistung benötigen, sollten Sie auch https://servicestack.net/ besuchen .

Bahri Gungor
quelle
2
Was sind die Unterschiede in der Serialisierungsleistung zwischen den beiden? Nehmen wir an, sie serialisieren dieselbe Anzahl von Entitäten mit derselben Anzahl von Attributen.
Adrian Salazar
20

Beide machen ungefähr das Gleiche, verwenden jedoch eine sehr unterschiedliche Infrastruktur, wodurch unterschiedliche Einschränkungen für die Klassen gelten, die Sie serialisieren / deserialisieren möchten, und bieten ein unterschiedliches Maß an Flexibilität bei der Optimierung des Serialisierungs- / Deserialisierungsprozesses.

Denn DataContractJsonSerializerSie müssen alle Klassen, die Sie serialisieren möchten, mit DataContractatrtibute und alle Mitglieder mit DataMemberattribute markieren . Wenn einige von Ihnen Klassen Aufzählungsmitglieder haben, müssen die Aufzählungen auch als DataContractund jedes Aufzählungsmitglied markiert werden - mit EnumMemberAttribut. Außerdem DataContractJsonSerializerkönnen Sie den gesamten Prozess der Serialisierung / Deserialisierung genau steuern, indem Sie die Typauflösungslogik ändern und die von Ihnen serialisierten Typen durch Ersatztypen ersetzen.

Für JavaScriptSerializerSie müssen parameterlosen Konstruktor zur Verfügung stellen , wenn Sie auf Deserialisieren Objekte aus JSON - String planen.

Für mich verwende ich normalerweise JavaScriptSerializerin der Präsentationslogik, wo es ein einfaches Modell gibt, das ich in Json zusammen mit page ohne zusätzliche Ajax-Anforderungen rendern möchte. Und ich muss sie normalerweise sogar nicht wieder auf c # deserialisieren - es gibt also überhaupt keinen Overhead. Wenn es sich jedoch um eine Persistenzlogik handelt, bei der ich Objekte in einem Datenspeicher speichern möchte (normalerweise kein SQL-Speicher), um sie später zu laden, bevorzuge ich die Verwendung, DataContractJsonSerializerda der Aufwand für das Einfügen von Attributen eine Flexibilität bei der Optimierung des Serialisierungs- / Deserialisierungsprozesses wert ist. insbesondere, wenn es darum geht, serialisierte Daten mit aktualisierten Definitionen in die Objekte der neueren Version zu laden

Achekh
quelle
2

Persönlich denke ich, dass das nach DataContractJsonSerializerÜberentwicklung riecht. Ich würde es überspringen und mitgehen JavaScriptSerializer. Falls JavaScriptSerializeres nicht verfügbar ist, können Sie FridayThe13th (eine Bibliothek, die ich geschrieben habe; p) verwenden.

JP Richardson
quelle
Json.Net ist überall. .Net 2.0, 3.5, 4.0, Silverlight, WindowsPhone
LB