In meinem Fall gibt es verschiedene Gründe, die mich daran hindern, die JavaScriptSerializer . Hier sind einige von ihnen.
1) Unschöne Deserialisierung beim Umgang mit anonymen Typen
Während die Verwendung für die Serialisierung recht einfach ist:
~~JavaScriptSerializer serializer = new JavaScriptSerializer();
String json = serializer.Serialize(data);
Bei der Deserialisierung gibt es jedoch ein kleines Ärgernis, da der Deserialisierer einen generischen Typ zusammen mit dem Inhalt annimmt:
serializer.Deserialize<T>(String s)
Dies kann ein Problem darstellen, wenn der Typ T zur Kompilierzeit nicht bekannt ist und dynamisch sein muss. Die Umgehung ist ein wenig hässlich, wie ich gelernt habe, weil es Reflexion verwendet, um eine generische Methode zu erstellen (aber es funktioniert)
var result = typeof(JavaScriptSerializer).GetMethod("Deserialize")
.MakeGenericMethod(JsonDataType)
.Invoke(serializer, new object[] { inputContent });~~
Bitte beachten Sie Laut einem Kommentar von Dave Ward zu dieser Antwort gibt es eine DeserializeObject()
die zur Verhinderung dieses Problems eingesetzt werden können.
2) Kann nicht mit zirkulären Referenzen umgehen
Ich habe dies gesehen, indem ich Entity Framework , Linq to SQL, NHibernate, NetTiers und sogar bei Verwendung von Burgs Vollmacht .
Según MS Verbinden die Ausnahme für zirkuläre Verweise wird ausgelöst, wenn eine navigierbare Beziehung zweiseitig ist (auf beide Seiten der Beziehung kann zugegriffen werden), so dass zunächst eine Seite der Beziehung deaktiviert werden muss. Die Ausnahme wird auch ausgelöst, wenn Sie 1:1-Beziehungen verwenden (oder 1:0..1 oder jede Beziehung, die die Erstellung einer Eigenschaft vom Typ EntityReference verursacht), in diesem Fall ist die Ausnahme vom Typ System.Data.Metadata.Edm.AssociationType
.
Die Lösung hierfür ist, dass der Serializer die Eigenschaften des Typs EntityReference ignoriert, indem er eine leere Implementierung einer von JavaScriptConverter abgeleiteten Klasse verwendet und diese mit der Methode RegisterConverters des JavaScriptSerializer-Objekts registriert.
3) Nützliche Funktionen, die zu weniger testbarem Code führen
Eine nützliche Funktion des JavaScriptSerializer ist, dass Sie auch einen benutzerdefinierten JavaScriptConverter implementieren und diesen an den JavaScriptSerializer übergeben können, um eine feinkörnige Kontrolle über die Serialisierung/Deserialisierung zu erhalten. Damit dies jedoch wirklich nützlich ist, müssen Sie die Typen zur Kompilierungszeit kennen und über Referenzen auf diese Typen verfügen. Dies schränkt die Nützlichkeit dieser Funktion ein, denn durch den Verweis auf diese Klassen wird Ihr Code eng gekoppelt, so dass Sie ihn nicht ohne weiteres in etwas wie einem MVC-Filter verwenden können.
Aus diesen Gründen habe ich oft auf Json.NET zurückgegriffen.
Ich hoffe, das hilft!