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.
quelle
Antworten:
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 .
quelle
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
DataContractJsonSerializer
Sie müssen alle Klassen, die Sie serialisieren möchten, mitDataContract
atrtibute und alle Mitglieder mitDataMember
attribute markieren . Wenn einige von Ihnen Klassen Aufzählungsmitglieder haben, müssen die Aufzählungen auch alsDataContract
und jedes Aufzählungsmitglied markiert werden - mitEnumMember
Attribut. AußerdemDataContractJsonSerializer
kö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
JavaScriptSerializer
Sie müssen parameterlosen Konstruktor zur Verfügung stellen , wenn Sie auf Deserialisieren Objekte aus JSON - String planen.Für mich verwende ich normalerweise
JavaScriptSerializer
in 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,DataContractJsonSerializer
da 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 ladenquelle
Persönlich denke ich, dass das nach
DataContractJsonSerializer
Überentwicklung riecht. Ich würde es überspringen und mitgehenJavaScriptSerializer
. FallsJavaScriptSerializer
es nicht verfügbar ist, können Sie FridayThe13th (eine Bibliothek, die ich geschrieben habe; p) verwenden.quelle