Qual è la differenza tra DataContractJsonSerializer e JavaScriptSerializer?


88

.NET Framework viene fornito con System.Runtime.Serialization.Json.DataContractJsonSerializer e System.Web.Script.Serialization.JavaScriptSerializer , che de / serializzano entrambi JSON. Come faccio a sapere quando scegliere uno di questi tipi rispetto agli altri? MSDN non chiarisce quali siano i loro vantaggi relativi.

Abbiamo diversi progetti che consumano o emettono JSON e la classe selezionata per ciascuno finora è dipesa dall'opinione dello sviluppatore principale di ogni progetto. Alcuni sono semplici, due hanno una logica complessa per quanto riguarda la produzione di tipi gestiti da JSON (i tipi non si associano strettamente ai flussi) ma non hanno alcuna enfasi sulla velocità, uno richiede velocità. Nessuno interagisce con WCF, almeno per ora.

Anche se sono interessato alle biblioteche alternative, spero che qualcuno possa avere una risposta anche alla mia domanda.


8
utilizzare Json.Net json.codeplex.com . Avrai molto più controllo sul processo di serializzazione / deserializzazione.
LB

Dipende da come lo usi. DataContractJsonSerializer tende a funzionare bene con WCF. JavaScriptSerializer è molto più semplice. Cosa stai cercando di fare?
jrummell

Usa ServiceStack.JsonSerializer: è il più veloce. Ma non onora l'attributo [ScriptIgnore]. Non è un problema se non ne hai bisogno. Vedi una lunga discussione al riguardo qui: stackoverflow.com/questions/9150920/…
Ofer Zelig

18
Perché tutti mettono le loro risposte nei commenti? Rende difficile votare le risposte o commentarle.
Justin R.

3
@JustinR. forse a causa di alcuni poliziotti qui che voterebbero per difetto di una riga e direbbero: "questo dovrebbe essere un commento".
nawfal

Risposte:


68

DataContractJsonSerializer è destinato all'uso con applicazioni client WCF in cui i tipi serializzati sono in genere classi POCO a cui è applicato l'attributo DataContract. Nessun DataContract, nessuna serializzazione. Il meccanismo di mappatura di WCF rende l'invio e la ricezione molto semplici, ma solo se la tua piattaforma è omogenea. Se inizi a mixare in diversi set di strumenti, il tuo programma potrebbe andare di traverso.

JavaScriptSerializer può serializzare qualsiasi tipo, inclusi i tipi anonimi (in un modo), e lo fa in modo più conforme. Perdi l '"automagic" di WCF, ma ottieni più opzioni di integrazione.

Come puoi vedere dai commenti, ci sono molte opzioni là fuori per la serializzazione AJAX e per rispondere alle tue domande sulla velocità e sulla manutenibilità, potrebbe valere la pena esaminarle per trovare una soluzione che soddisfi le esigenze di tutti i team, per ridurre i problemi di manutenibilità a lungo termine poiché ognuno fa le cose a modo suo.

AGGIORNAMENTO DEL 07/04/2014: Suggerisco di usare JSON.NET se puoi. Vedere http://james.newtonking.com/json Feature Comparison per una revisione delle 3 librerie considerate in questa domanda.

AGGIORNAMENTO DEL 26/05/2015: Se la tua azienda richiede l'uso di prodotti con licenza commerciale o hai bisogno di prestazioni fino all'ultimo bit, potresti anche voler controllare https://servicestack.net/ .


2
Quali sono le differenze di prestazioni di serializzazione tra i due? Diciamo che serializzeranno lo stesso numero di entità con lo stesso numero di attributi?
Adrian Salazar

20

Entrambi fanno più o meno lo stesso, ma utilizzano un'infrastruttura molto diversa, applicando così restrizioni diverse alle classi che si desidera serializzare / deserializzare e fornendo un diverso grado di flessibilità nell'ottimizzazione del processo di serializzazione / deserializzazione.

Perché DataContractJsonSerializerdevi contrassegnare tutte le classi che vuoi serializzare usando DataContractatrtibute e tutti i membri usando l' DataMemberattributo. Così come se alcune di voi classi hanno membri enum, anche gli enum devono essere contrassegnati come DataContracte ogni membro enum - con EnumMemberattributo. DataContractJsonSerializerConsente inoltre di controllare con precisione l'intero processo di serializzazione / deserializzazione alterando la logica di risoluzione dei tipi e sostituendo i tipi serializzati con surrogati.

Perché JavaScriptSerializerè necessario fornire un costruttore senza parametri se si prevede di deserializzare oggetti dalla stringa json.

Per me, di solito lo uso JavaScriptSerializernella logica di presentazione, dove c'è un semplice modello che voglio rendere in Json insieme a page, senza ulteriori richieste ajax. E di solito non devo nemmeno deserializzarli di nuovo in c #, quindi non c'è alcun sovraccarico. Ma se si tratta di logica di persistenza, in cui voglio salvare gli oggetti in un archivio dati (di solito archiviazione senza sql), per caricarli in seguito, preferisco utilizzarli DataContractJsonSerializerperché il sovraccarico di inserire attributi vale la flessibilità nell'ottimizzazione del processo di serializzazione / deserializzazione, soprattutto quando si tratta di caricare dati serializzati negli oggetti della versione più recente, con definizioni aggiornate


2

Personalmente, penso che DataContractJsonSerializerpuzzi di ingegneria eccessiva. Lo salterei e andrei con JavaScriptSerializer. Nel caso in cui JavaScriptSerializernon fosse disponibile, puoi utilizzare FridayThe13th (una libreria che ho scritto; p).


Json.Net è ovunque. .Net 2.0, 3.5, 4.0, Silverlight, WindowsPhone
LB
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.