Accueil > > > OPTIMISATION DE LA SERIALISATION JSON POUR LES LIST<T>
OPTIMISATION DE LA SERIALISATION JSON POUR LES LIST<T>
Information sur la source
Description
Cette source permet d'optimiser la sérialisation JSON d'une List<T>. Par défaut si un WebService retourne une List<T> alors toutes les propriétés seront répétés pour chacun des objets. On obtient alors un JSON ressemblant à : {"d": [ { "__type":"Person:#", "BirthDate":"\/Date(1211790363564+0200)\/", "City":"Chénas", "FirstName":"Steven", "LastName":"Vincent" },{ "__type":"Person:#", "BirthDate":"\/Date(1211790441107+0200)\/", "City":"Légny", "FirstName":"Janet", "LastName":"laurent" },{ // etc... Cette astuce permet d'avoir un json ressemblant à : {"d":{ "Columns":[ "FirstName", "LastName", "BirthDate", "City" ],"Values":[ ["Andrew","Alex","\/Date(1211790586937+0200)\/","S aint-Didier-sur-Beaujeu"], ["Laura","Claude","\/Date(1211790697591+0200)\/"," Chénas"], ["Anne","Isabelle","\/Date(1211790655756+0200)\/", "Saint-Cyr-le-Chatoux"], ["Nancy","Steph","\/Date(1211790592372+0200)\/","S ainte-Paule"], // etc On obtient un gain de traffic de l'ordre de 50%.
Source
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Runtime.Serialization;
using System.Collections.Generic;
using System.Reflection;
/// <summary>
/// Permet d'optimiser la serailisation JSON d'une List<T>
/// </summary>
/// <typeparam name="T"></typeparam>
[DataContract]
public class JsonList<T>
{
#region Constructors
private static IEnumerable<String> _columns;
private static IEnumerable<PropertyInfo> _properties;
/// <summary>
/// Ce constructeur sera appelé lors de la premiere utilisation du type "finale" => pour chaque T
/// </summary>
static JsonList()
{
// mis en cache de la liste des colonne en fonction du type T
// TODO : Je ne prend pas en compte toutes les options du DataMemberAttribute, il y a donc des bugs si on joue avec des cas spécifique
_properties = (from property in typeof(T).GetProperties()
let dataMemberAttributes = (DataMemberAttribute[])property.GetCustomAttributes(typeof(DataMemberAttribute), false)
where dataMemberAttributes.Length > 0
select property
).ToList(); // ToList pour pas garder le IEnumerable et donc refaire la requête à chaque fois
_columns = (from property in _properties
// on pourrait mettre la recherche de l'attribut en cache à partir de la requete précedente,
// mais cela nécessite de créer une structure rien que pour ca ...
let dataMemberAttribute = ((DataMemberAttribute[])property.GetCustomAttributes(typeof(DataMemberAttribute), false))[0]
select !String.IsNullOrEmpty(dataMemberAttribute.Name) ? dataMemberAttribute.Name : property.Name
).ToList(); // ToList pour pas garder le IEnumerable et donc refaire la requête à chaque fois
}
private IEnumerable<T> _innerList;
public JsonList(IEnumerable<T> innerList)
{
this._innerList = innerList;
}
#endregion
#region implicit casting operator
public static implicit operator JsonList<T>(List<T> items)
{
return new JsonList<T>(items);
}
public static implicit operator JsonList<T>(T[] items)
{
return new JsonList<T>(items);
}
#endregion
#region Properties
/// <summary>
/// Contient un tableau contenant le nom des différents colonnes
/// </summary>
[DataMember]
public IEnumerable<String> Columns
{
get { return _columns; }
set { throw new NotSupportedException("Deserialization of this object is not supporter yet"); }
}
/// <summary>
/// Contient un tableau de tableau contenant les valeurs de la list
/// </summary>
/// <remarks>
/// [
/// ['FirstName1', 'LastName1'],
/// ['FirstName2', 'LastName2']
/// ]
/// </remarks>
[DataMember]
public IEnumerable<IEnumerable<Object>> Values
{
get
{
// TODO : optimiser ca en utilisant les Expression de C#3 afin de mettre en cache le getter
return from item in this._innerList
select from property in _properties
select property.GetValue(item, null);
}
set { throw new NotSupportedException("Deserialization of this object is not supporter yet"); }
}
#endregion
}
Conclusion
L'exemple fourni dans le zip montre la différence entre la serialisation classique et l'optimisation.
J'ai utilisé un service WCF, mais ce code devrait également fonctionner pour les services web asmx classique, il faut juste rajouter un attribut DataMember sur les propriétés à sérializer.
Je ne prend pas en compte toutes les possibilités de l'attribut DataMember de WCF, il se peut qu'il y ait quelques bugs si on n'utilise pas cet attribut comme je l'ai prévu :)
Plus d'explication sont disponible ici : http://blogs.developpeur.org/cyril/archive/2008/05 /26/json-optimiser-serialisation-list-aspnet-ajax. aspx
Historique
- 26 mai 2008 11:17:30 :
- Rajout d'un lien vers mon post sur mon blog.
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Gridview - Linq - Mode édition et DropDownList [ par tvaillie ]
Bonjour.J'ai un souci alors que j'essaie d'utiliser une gridview avec du Linq. (Je ne suis pas sur que le problème vienne de Linq d'ailleurs)Je vous e
Probleme avec le WCF service Host de visual studio 2008 [ par juju008 ]
Bonjour à tous, Je suis depuis plus de 24h consécutives à la recherche d'une solution à mon probleme. J'ai créé nouveau projet de workflow séquentiel
question Linq to sql [ par ChamY ]
Bonjour,Je bloque sur un truc surement bête et je recherche de l'aide surr du Linq To Sql.Donc j'ai une page avec un gridview qui liste mes taches et
Silverlight et WCF [ par mastoc ]
Bonjour !bon tout d'abord je pose ma question ici car ce forum me semble le plus approprié. J'espère que c'est cas sinon veuillez m'excuser d'avance:)
linq - jointure de table [ par wally88 ]
Bonjour, je n'arrive pas a joindre mes tables ou a "trier" :'(exemple pour récupérer les lignes en rapport entre deux tables, je lui dis que la table
Erreur WCF : Le ChannelDispatcher ne peut pas ouvrir son IChannelListener [ par EmacLi ]
Bonjour,Je viens de créer un service WCF mais pas moyen de le faire démarrer par mon application hote (application console). Il me retourne l'erreur s
Problème ItemDataBound, DataItem avec LINQ [ par walterskinner ]
Bonjour, Cela fait maintenant deux jours que je cherche
erreur due à InsertAllOnSubmit() [ par khawlaaa ]
Bonjour tout le monde , je suis entrain de travailler sur un WebSite ( asp.net et C#) j'ai divisé mon projet en 3 couches: *UI *BLL *DAO L
WCF -- WEB CONFIG -- DMZ [ par Kikuts ]
Bonjour, j'ai une application silverlight qui utilise un web service. En local tout marche toujours ! Sur un serveur, ça marche en trichant un peu. Su
|
Derniers Blogs
CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT)CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT) par FREMYCOMPANY
Bonjour à tous, Je viens de publier une proposition comprenant 5 pseudo-classes pour le CSS Working Group ayant trait à l'état de chargement d'un élément (ex: IMG,VIDEO,AUDIO,OBJECT pour l'HTML.). Si le c½ur vous en dit, vous pouvez retrouver cette p...
Cliquez pour lire la suite de l'article par FREMYCOMPANY MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ?MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ? par ROMELARD Fabrice
Formation initiale Durant la formation, le découpage classique est le suivant (je donnerai les équivalences Suisse lorsque je les connaîtrais) : Ecole primaire jusqu'au Collège : Formation générale permettant d'obtenir les méthodes...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice Y'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENTY'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENT par Aleks
Quand on a ce genre d'erreur sans log :
Et bas on a juste envie de choper le gas de Microsoft qu'a développé ça et lui foutre des baffes de Coboye ! ...
Cliquez pour lire la suite de l'article par Aleks [HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL[HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL par Pierrick CATRO-BROUILLET
Avec la sortie prochaine de la Beta Consumer Preview de Windows 8, j'avais envie de revenir sur une des fonctionnalités que j'attends le plus et que, en bon geek que je suis, j'utilise déjà : Hyper-V 3 ainsi son module PowerShell.
Il y a déjà pléthor...
Cliquez pour lire la suite de l'article par Pierrick CATRO-BROUILLET IIS7 - COMPRESSION GZIPIIS7 - COMPRESSION GZIP par cyril
La compression GZIP permet d'améliorer les performances de navigation en compressant ce qu'envoie le serveur à un client. Pour comprendre comment cela fonctionne, regardons ce qu'il se passe au niveau HTTP lorsqu'un client tente d'accéder à une ress...
Cliquez pour lire la suite de l'article par cyril
Forum
SCRIPTSCRIPT par nadialadypower
Cliquez pour lire la suite par nadialadypower
Logiciels
Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning Academy System (17.1.3.0)ACADEMY SYSTEM (17.1.3.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|