Quelle est la différence entre DataContractJsonSerializer et JavaScriptSerializer?

88

Le .NET Framework est livré avec System.Runtime.Serialization.Json.DataContractJsonSerializer et System.Web.Script.Serialization.JavaScriptSerializer , qui dé / sérialisent tous deux JSON. Comment savoir quand choisir l'un de ces types plutôt que l'autre? MSDN ne précise pas quels sont leurs avantages relatifs.

Nous avons plusieurs projets qui consomment ou émettent du JSON, et la classe sélectionnée pour chacun jusqu'à présent dépendait de l'opinion du développeur principal sur chaque projet. Certains sont simples, deux ont une logique complexe concernant la production de types gérés à partir de JSON (les types ne correspondent pas étroitement aux flux) mais ne mettent pas l'accent sur la vitesse, l'un nécessite de la vitesse. Aucun n'interagit avec WCF, du moins pour le moment.

Bien que je m'intéresse aux bibliothèques alternatives, j'espère que quelqu'un pourra également avoir une réponse à ma question.

Justin R.
la source
8
utilisez Json.Net json.codeplex.com . Vous aurez beaucoup plus de contrôle sur le processus de sérialisation / désérialisation.
LB
Cela dépend de la façon dont vous l'utilisez. DataContractJsonSerializer a tendance à bien fonctionner avec WCF. JavaScriptSerializer est beaucoup plus simple. Qu'essayez-vous de faire?
jrummell
Utilisez ServiceStack.JsonSerializer - c'est le plus rapide. Mais il n'honore pas l'attribut [ScriptIgnore]. Pas de problème si vous n'en avez pas besoin. Voir une longue discussion à ce sujet ici: stackoverflow.com/questions/9150920/…
Ofer Zelig
18
Pourquoi tout le monde met-il ses réponses dans les commentaires? Il est difficile de voter sur les réponses ou de les commenter.
Justin R.
3
@JustinR. peut-être à cause de certains policiers ici qui voteraient contre les réponses d'une ligne et diraient: "cela devrait être un commentaire".
nawfal

Réponses:

68

Le DataContractJsonSerializer est destiné à être utilisé avec les applications clientes WCF où les types sérialisés sont généralement des classes POCO avec l'attribut DataContract qui leur est appliqué. Pas de DataContract, pas de sérialisation. Le mécanisme de mappage de WCF rend l'envoi et la réception très simples, mais uniquement si votre plateforme est homogène. Si vous commencez à mélanger dans différents ensembles d'outils, votre programme peut aller de travers.

JavaScriptSerializer peut sérialiser n'importe quel type, y compris les types anonymes (dans un sens), et le fait d'une manière plus conforme. Vous perdez le "automagic" de WCF, mais vous gagnez plus d'options d'intégration.

Comme vous pouvez le voir dans les commentaires, il existe de nombreuses options pour la sérialisation AJAX, et pour répondre à vos questions de vitesse par rapport à la maintenabilité, il pourrait être utile de les examiner pour trouver une solution qui répond aux besoins de toutes les équipes. réduisez les problèmes de maintenabilité à long terme car chacun fait les choses à sa manière.

MISE À JOUR du 07/04/2014: Je suggère d'utiliser JSON.NET si vous le pouvez. Voir http://james.newtonking.com/json Feature Comparison pour une revue des 3 bibliothèques considérées dans cette question.

2015-05-26 MISE À JOUR: Si votre entreprise nécessite l'utilisation de produits sous licence commerciale, ou si vous avez besoin de toutes les performances, vous pouvez également consulter https://servicestack.net/ .

Bahri Gungor
la source
2
Quelles sont les différences de performances de sérialisation entre les deux? Disons qu'ils sérialiseront le même nombre d'entités avec le même nombre d'attributs?
Adrian Salazar
20

Les deux font approximativement la même chose mais en utilisant une infrastructure très différente, appliquant ainsi différentes restrictions sur les classes que vous souhaitez sérialiser / désérialiser et offrant un degré différent de flexibilité dans le réglage du processus de sérialisation / désérialisation.

Car DataContractJsonSerializervous devez marquer toutes les classes que vous souhaitez sérialiser en utilisant DataContractatrtibute et tous les membres en utilisant l' DataMemberattribut. De même que si certaines de vos classes ont des membres enum, les énumérations doivent également être marquées comme DataContractet chaque membre enum - avec EnumMemberattribut. Vous DataContractJsonSerializerpermet également de contrôler finement l'ensemble du processus de sérialisation / désérialisation en modifiant la logique de résolution des types et en remplaçant les types que vous sérialisez par des substituts.

Pour JavaScriptSerializervous devez fournir un constructeur sans paramètre si vous prévoyez de désérialiser des objets de la chaîne json.

Pour moi, j'utilise généralement JavaScriptSerializerdans la logique de présentation, où il y a un modèle simple que je veux rendre dans Json avec la page, sans demandes ajax supplémentaires. Et je n'ai même généralement pas besoin de les désérialiser en c # - il n'y a donc pas de frais généraux. Mais si c'est une logique de persistance, où je veux enregistrer des objets dans un magasin de données (généralement pas de stockage SQL), pour les charger plus tard, je préfère utiliser DataContractJsonSerializerparce que la surcharge de mettre des attributs vaut de la flexibilité dans le réglage du processus de sérialisation / désérialisation, surtout lorsqu'il s'agit de charger des données sérialisées dans les objets de la version plus récente, avec des définitions mises à jour

achekh
la source
2

Personnellement, je pense que ça DataContractJsonSerializersent la sur-ingénierie. Je le sauterais et j'irais avec JavaScriptSerializer. Dans le cas où il JavaScriptSerializern'est pas disponible, vous pouvez utiliser FridayThe13th (une bibliothèque que j'ai écrite; p).

JP Richardson
la source
Json.Net est partout. .Net 2.0, 3.5, 4.0, Silverlight, WindowsPhone
LB