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.
la source
Réponses:
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/ .
la source
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
DataContractJsonSerializer
vous devez marquer toutes les classes que vous souhaitez sérialiser en utilisantDataContract
atrtibute et tous les membres en utilisant l'DataMember
attribut. De même que si certaines de vos classes ont des membres enum, les énumérations doivent également être marquées commeDataContract
et chaque membre enum - avecEnumMember
attribut. VousDataContractJsonSerializer
permet é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
JavaScriptSerializer
vous 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
JavaScriptSerializer
dans 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 utiliserDataContractJsonSerializer
parce 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 à jourla source
Personnellement, je pense que ça
DataContractJsonSerializer
sent la sur-ingénierie. Je le sauterais et j'irais avecJavaScriptSerializer
. Dans le cas où ilJavaScriptSerializer
n'est pas disponible, vous pouvez utiliser FridayThe13th (une bibliothèque que j'ai écrite; p).la source