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.
źródło
Odpowiedzi:
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/ .
źródło
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
DataContractJsonSerializer
trzeba zaznaczyć wszystkie klasy, które chcesz serializacji użyciuDataContract
atrtibute a wszyscy jej członkowie za pomocąDataMember
atrybutu. Oprócz tego, że niektóre z klas mają członków wyliczenia, wyliczenia również muszą być oznaczone jako,DataContract
a każdy element członkowski wyliczenia - zEnumMember
atrybutem.DataContractJsonSerializer
Umoż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
JavaScriptSerializer
planujesz deserializację obiektów z ciągu json, musisz zapewnić konstruktor bez parametrów.Dla mnie zwykle używam
JavaScriptSerializer
w 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ć,DataContractJsonSerializer
ponieważ 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źródło
Osobiście uważam, że to
DataContractJsonSerializer
cuchnie nadmierną inżynierią. Pominąłem to i poszedłem zJavaScriptSerializer
. W przypadku, gdyJavaScriptSerializer
nie jest dostępny, możesz użyć FridayThe13th (biblioteka, którą napisałem; p).źródło