Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Atteint de JavaScriptite Aiguë [Cyril Durand]

Expert ASP.net Ajax et WCF, Cyril Durand parle dans son blog de point techniques sur ASP.net, ASP.net Ajax, JavaScript, WCF et .net en général. Cyril est également consultant indépendant, n'hésitez pas à le contacter pour de l'assistance sur vos projets

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    N'hésitez pas à me contacter pour vos projets .net : architecture, accompagnement, formation, ...

    View Cyril Durand's profile on LinkedIn
    hit counters


    Expertise Commerce server et BizTalk

JSON - optimiser la sérialisation des List<T> par ASP.net AJAX

Grâce au service web et ASP.net Ajax, il est très simple de communiquer avec notre serveur à partir de JavaScript. En effet, il suffit de créer un service WCF (ou asmx) de rajouter quelques attributs et on peut appeler nos WebMethods à partir de JavaScript. En interne une sérialisation JSON (JavaScript Object Notation) est utilisée.

Malheureusement il est impossible de customiser cette sérialisation. Pourquoi vouloir personnaliser cette sérialisation ? Prenons le cas d'une méthode GetPersons qui renvoie une centaine de personne.

Le JSON aura cette tête :

{"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...

On peut voir que le nom des "colonnes" se répètent inutilement. L'idée serait d'avoir un JSON ayant cette tête :

{"d":{ "Columns":[ "FirstName", "LastName", "BirthDate", "City" ],"Values":[ ["Andrew","Alex","\/Date(1211790586937+0200)\/","Saint-Didier-sur-Beaujeu"], ["Laura","Claude","\/Date(1211790697591+0200)\/","Chénas"], ["Anne","Isabelle","\/Date(1211790655756+0200)\/","Saint-Cyr-le-Chatoux"], ["Nancy","Steph","\/Date(1211790592372+0200)\/","Sainte-Paule"], // etc

Pour arriver à un tél résultat, je ne retourne plus une List<Person> mais une JsonList<Person>. Cette JsonList<T> possède 2 propriétés : Columns de type IEnumerable<String> et Values de type IEnumerable<IEnumerable<Object>>.

Dans mon exemple, pour 100 personnes, on passe de 12.8 ko à 6.8 ko, soit presque 50%. Cette optimisation nous permet alors d'obtenir une application plus réactive.

Côté client, pour retrouver un tableau d'objet plutôt qu'un objet "bizarre", on pourra utiliser ce code :

// permet de retourner un tableau d'objet classique plutot qu'une objet bizarre var a = []; var propCount = result.Columns.length; var propNames = result.Columns; for(var i = 0, l = result.Values.length; i < l; i++){ var values = result.Values[ i ]; var o = {}; for(var j = 0; j < propCount; j++){ o[propNames[j]] = values[j] } a[a.length] = o; }

Le code et l'exemple de cette JsonList se trouve sur aspfr :  Optimisation de la sérialisation Json pour les List<T>

Posted: lundi 26 mai 2008 11:14 par cyril
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

FREMYCOMPANY a dit :

Pas mal !

Même si je reste convaincu qu'il serait dix milles fois mieux d'utiliser un JSON "de terrain" avec des new Date(), new Person(), ...

J'aime aussi Object.prototype.With=function(props) {...}

(new Person("François", "REMY", 16)).With({Language:"French",Job:"Student"})

# mai 26, 2008 17:19

cyril a dit :

modifier le prototype de Object ??? quelle drôle d'idée ! beurk !

pour ton json de "terrain", attention ce n'est plus du JSON. Ce serait certes "mieux" mais dans mon cas ca ne change rien.

# mai 26, 2008 18:59

FREMYCOMPANY a dit :

Modifier le prototype d'Object est très souvent utile.

Par exemple pour rajouter cette fonction With ou encore un forEach (comme pour les arrays donc mais avec un for...in) ou un attachJSEvent(methodName, handler) (méthode qui "encapsule" la méthode "methodName" et appelle l'handler avant, histoire de pouvoir faire du log ou des trucs du genre, ... C'est très très utile, je trouve.

Alors oui, mon "JSON de terrain", ce n'est pas du JSON. Mais qu'est-ce que c'est pratique.

Dans ton cas, ca peut aider (et c'est même encore plus court) :

[

  new Person("x","y",new Date(xxxx)),

  new Person("a","c",new Date(yyyy)),

  new Person("b","d",new Date(zzzz)),

]

# mai 26, 2008 21:04

cyril a dit :

polluer le prototype d'objet n'est pas une bonne chose, la plupart des frameworks ne le font pas (ou en tout cas, le font plus). Etendre object ne permet pas de garantir une bonne compatibilité si on utilise plusieurs frameworks (ce que beaucoup de développeur/intégrateurs font ...)  

Niveau perf, je pense pas que ca change grand chose.

# mai 26, 2008 21:43

phoenixenator a dit :

Bonjour, super code!!

J'ai suivi ton exemple de sérialisation et j'ai voulu intégrer le code client dans la librairie ExtJs mais je n'ai pas trouvé comment faire. J'ai cherché à l'intégrer  au niveau du GridPanel ou du JsonStore mais sans succès.

Aurais-tu une idée comment faire.

# mai 27, 2008 15:32

cyril a dit :

En créant un store qui hérite de ArrayStore (je crois) tu devrais pouvoir t'en sortir. sinon il faut créer un store de 0

# mai 27, 2008 15:56

FREMYCOMPANY a dit :

"polluer le prototype d'objet n'est pas une bonne chose" &gt; Tout est question d'intelligence dans les notations.

Si tu utilises des fonctions potentiellement implémentables dans d'autres FrameWorks, c'est idiot, mais si c'est des choses que tu es sûr de ne jamais rencontrer, il n'y a pas de problème. Maintenant ca ne doit pas devenir une généralité non plus.

# mai 28, 2008 16:14
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Compte rendu : SharePoint / O365 : des pratiques pour une meilleure productivité par The Mit's Blog le 12-12-2014, 18:11

- [TFS] Suppression des feature SQL Entreprise en masse par Blog de Jérémy Jeanson le 12-06-2014, 09:18

- [Clean Code] règles de nommage par Fathi Bellahcene le 12-04-2014, 22:59

- Windows To Go 10 et Upgrades impossibles par Blog de Jérémy Jeanson le 12-04-2014, 21:38

- SharePoint OnPremise: Statistiques d’utilisation pour traquer les sites fantomes par Blog Technique de Romelard Fabrice le 12-03-2014, 10:28

- SharePoint 2007: Script PowerShell permettant le backup de toutes les collections de sites d’une application Web par Blog Technique de Romelard Fabrice le 12-02-2014, 10:00

- Xamarin : un choix précieux par .net is good... C# is better ;) le 12-01-2014, 15:10

- Office 365: Comparaison des composants pour préparer votre migration de SharePoint 2007 vers Office 365 par Blog Technique de Romelard Fabrice le 11-28-2014, 16:20

- Créer un périphérique Windows To Go 10 ! par Blog de Jérémy Jeanson le 11-21-2014, 04:54

- RDV à Genève le 12 décembre pour l’évènement “SharePoint–Office 365 : des pratiques pour une meilleure productivité !” par Le blog de Patrick [MVP Office 365] le 11-19-2014, 10:40