Jaka jest różnica między DataContractJsonSerializer i JavaScriptSerializer?

88

NET Framework jest dostarczany z System.Runtime.Serialization.Json.DataContractJsonSerializer i System.Web.Script.Serialization.JavaScriptSerializer , z których oba de / serializują JSON. Skąd mam wiedzieć, kiedy wybrać jeden z tych typów zamiast drugiego? MSDN nie wyjaśnia, jakie są ich względne zalety.

Mamy kilka projektów, które wykorzystują lub emitują JSON, a klasa wybrana dla każdego do tej pory zależała od opinii głównego programisty w każdym projekcie. Niektóre są proste, dwa mają złożoną logikę dotyczącą tworzenia zarządzanych typów z formatu JSON (typy nie są odwzorowywane blisko strumieni), ale nie mają żadnego nacisku na szybkość, jeden wymaga szybkości. Żadne nie współdziałają z WCF, przynajmniej od teraz.

Chociaż interesuję się bibliotekami alternatywnymi, mam nadzieję, że ktoś też może znaleźć odpowiedź na moje pytanie.

Justin R.
źródło
8
użyj Json.Net json.codeplex.com . Będziesz mieć znacznie większą kontrolę nad procesem serializacji / deserializacji.
LB
Zależy od tego, jak go używasz. DataContractJsonSerializer zwykle dobrze współpracuje z WCF. JavaScriptSerializer jest znacznie prostszy. Co próbujesz zrobić?
jrummell
Użyj ServiceStack.JsonSerializer - jest najszybszy. Ale nie honoruje atrybutu [ScriptIgnore]. Nie ma problemu, jeśli go nie potrzebujesz. Zobacz długą dyskusję na ten temat tutaj: stackoverflow.com/questions/9150920/…
Ofer Zelig
18
Dlaczego wszyscy umieszczają swoje odpowiedzi w komentarzach? Utrudnia to głosowanie nad odpowiedziami lub komentowanie ich.
Justin R.
3
@JustinR. być może z powodu jakiejś policji, która zlekceważyłaby odpowiedzi w jednej linii i powiedziała: „to powinien być komentarz”.
nawfal

Odpowiedzi:

68

DataContractJsonSerializer jest przeznaczony do użytku z aplikacjami klienckimi WCF, w których serializowane typy są zwykle klasami POCO z zastosowanym do nich atrybutem DataContract. Bez DataContract, bez serializacji. Mechanizm mapowania WCF sprawia, że ​​wysyłanie i odbieranie jest bardzo proste, ale tylko wtedy, gdy Twoja platforma jest jednorodna. Jeśli zaczniesz mieszać różne zestawy narzędzi, Twój program może się zepsuć.

JavaScriptSerializer może serializować dowolny typ, w tym typy anonimowe (w jedną stronę), i robi to w bardziej zgodny sposób. Tracisz „automagię” WCF, ale zyskujesz więcej opcji integracji.

Jak widać w komentarzach, istnieje wiele opcji serializacji AJAX, a aby odpowiedzieć na pytania dotyczące szybkości i łatwości konserwacji, warto je zbadać, aby znaleźć rozwiązanie spełniające potrzeby wszystkich zespołów, aby ograniczyć problemy z konserwacją w dłuższej perspektywie, ponieważ każdy robi rzeczy po swojemu.

AKTUALIZACJA 2014-04-07: Jeśli możesz, sugeruję używanie JSON.NET. Zobacz http://james.newtonking.com/json Porównanie funkcji, aby zapoznać się z przeglądem trzech bibliotek uwzględnionych w tym pytaniu.

AKTUALIZACJA 2015-05-26: Jeśli Twoja firma wymaga korzystania z produktów, na które można uzyskać licencję komercyjną, lub potrzebujesz wszystkiego, co najlepsze, możesz również sprawdzić https://servicestack.net/ .

Bahri Gungor
źródło
2
Jakie są różnice w wydajności serializacji między nimi? Powiedzmy, że będą serializować tę samą liczbę jednostek z tą samą liczbą atrybutów?
Adrian Salazar,
20

Oba robią w przybliżeniu to samo, ale używają bardzo różnej infrastruktury, w ten sposób stosując różne ograniczenia dla klas, które chcesz serializować / deserializować i zapewniając inny stopień elastyczności w dostrajaniu procesu serializacji / deserializacji.

Dla DataContractJsonSerializertrzeba zaznaczyć wszystkie klasy, które chcesz serializacji użyciu DataContractatrtibute a wszyscy jej członkowie za pomocą DataMemberatrybutu. Oprócz tego, że niektóre z klas mają członków wyliczenia, wyliczenia również muszą być oznaczone jako, DataContracta każdy element członkowski wyliczenia - z EnumMemberatrybutem. DataContractJsonSerializerUmożliwia również precyzyjną kontrolę nad całym procesem serializacji / deserializacji, zmieniając logikę rozpoznawania typów i zastępując typy serializowane przez surogaty.

Jeśli JavaScriptSerializerplanujesz deserializację obiektów z ciągu json, musisz zapewnić konstruktor bez parametrów.

Dla mnie zwykle używam JavaScriptSerializerw logice prezentacji, gdzie jest prosty model, który chcę wyrenderować w Json razem ze stroną, bez dodatkowych żądań ajax. Zwykle nawet nie muszę ich deserializować z powrotem do C # - więc nie ma żadnego narzutu. Ale jeśli jest to logika trwałości, w której chcę zapisywać obiekty w magazynie danych (zwykle w magazynie bez sql), aby załadować je później, wolę używać, DataContractJsonSerializerponieważ obciążenie związane z umieszczaniem atrybutów jest warte elastyczności w dostrajaniu procesu serializacji / deserializacji, zwłaszcza jeśli chodzi o ładowanie serializowanych danych do obiektów nowszej wersji, ze zaktualizowanymi definicjami

bóle
źródło
2

Osobiście uważam, że to DataContractJsonSerializercuchnie nadmierną inżynierią. Pominąłem to i poszedłem z JavaScriptSerializer. W przypadku, gdy JavaScriptSerializernie jest dostępny, możesz użyć FridayThe13th (biblioteka, którą napisałem; p).

JP Richardson
źródło
Json.Net jest wszędzie. .Net 2.0, 3.5, 4.0, Silverlight, WindowsPhone
LB