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

Ajax Beta et serialization JSON

Le but de Microsoft Ajax Extension et de toutes les librairies Ajax servant à faire des applications "Web 2.0" est d'améliorer l'expérience utilisateur, l'utilisation de l'objet XMlHttpRequest aide beaucoup puisque c'est lui qui permet de faire des requêtes HTTP en JavaScript, on peut donc facilement rafraichir une partie de la page sans la recharger entierement.

Microsoft Ajax Extension met à disposition le contrôle UpdatePanel qui permet trés facilement de rafraichir une zone de la page. Mais lorsqu'on veut faire quelque chose de plus précis : dialoguer avec le serveur, les UpdatePanels ne sont pas du tout adaptés. Pour cela Microsoft Ajax Extension met à disposition tout un système de serialization qui permet d'appeler en JavaScript une méthode d'un WebService tout en conservant un typage fort.  Les échanges client/serveur se fait en JSON (JavaScript Object Notation) ce qui permet des échanges simple et léger. J'avais parlé de cette fonctionnalité sur ce billet : Serializer en JSON un objet .net avec Atlas (July CTP).

Aujourd'hui j'ai eu besoin de transmettre des objets Polygon, cet objet contient entre autre une collection d'objet Point qui contient lui même deux propriétés longitude et latitude rien de très compliqué. Mon objet client Polygon contient diverses méthodes trés pratique comme le calcul de la surface, il faut donc que mon échange JSON contiennent des objets typé de plus un polygon peut contenir plusieurs centaines de points, il est donc intéressant d'optimiser la taille des échanges pour ne garder que l'essentiel.

Concrètement le but est d'avoir un JSON ressemblant à

{"polygon1": new Itelios.Geo.Polygon([[7,7],[9,2],[7,5],[5,2],[2,1],[1,5]])}

plutôt que

{"polygon1":{"__type":"Itelios.Geo.Polygon","Points":[{"Longitude":7,"Latitude":7},{"Longitude":9,"Latitude":2},{"Longitude":5,"Latitude":0},{"Longitude":9,"Latitude":5},{"Longitude":3,"Latitude":2},{"Longitude":2,"Latitude":8}]}}

Ce qui améliore évidemment la rapidité des échanges et permet aussi d'avoir un objet déjà typé et utilisable directement côté client.

Ca tombe bien c'est exactement ce que faisait l'objet JavaScriptConverter, j'avais expliqué comment l'utiliser sur ce post. Je créer donc un nouveau type PolygonConverter que j'hérite de JavaScriptConverter, je découvre avec horreur que les méthodes de la classe abstraite ont été modifié !

public class PolygonConverter : JavaScriptConverter { public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) { throw new Exception("The method or operation is not implemented."); } public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) { throw new Exception("The method or operation is not implemented."); } public override IEnumerable<Type> SupportedTypes { get { throw new Exception("The method or operation is not implemented."); } } }

Ce qui me pose problème est le type de retour et d'entrée : IDictionary<String, Object> au lieu de String comme c'était le cas pour les CTP d'"Atlas" cela veut dire qu'on ne peut plus retourner des types personnalisés. Après quelques minutes de recherche sur comment contourner cette horreur je confirme mes doutes, il y a eu de grosses modifications au niveau de la sérialization en JSON des types .net : on ne peut plus utiliser de type personnalisé lors de la (de)sérialization d'un type .net/jS, le JavaScriptConverter a perdu 90% de son utilité !!! La sérialization JSON d'Atlas est désormais une sorte de gros tableau contenant que des types primitifs :(

Je décide donc de regarder en détail le fonctionnement de la sérialization JSON, après plusieurs heures de Reflector (vivi plusieurs heures !!!) j'ai du me resigner au fait que cette GRANDIOSE fonctionnalité a été supprimé entre les versions CTP et beta !

En analysant la serialization j'ai découvert une chose encore plus horrible, la méthode Microsoft.Web.Script.Serialization.JavaScriptObjectSerializer.Serialize(obj) n'existe plus (idem pour Deserialize) ! Cette méthode retournait le contenu JSON de l'objet qu'on lui passait en paramètre.

Me voila donc devant un gros problème, l'application sur laquelle je travail actuellement nécessite de nombreux échanges d'objet Polygon et autre objet du même genre, Atlas ne m'offre plus aucun moyen de m'aider.

Pour résoudre ce problème je vois deux solutions :

  • J'écrit un HttpModule qui modifie à la volée le contenu JSON, c'est ultra crade mais trés rapide à coder.
  • Je réécrit toute la serialization .net / JSON qui était déjà écrit avec les CTP mais supprimé avec les nouvelles versions !

Vu le nombre d'heure passé dans Reflector sur le sujet je pense m'orienter vers la 2ème solution en intégrant mon projet AsyncMethods

Pour conclure

La sérialization JSON<=>.net a été modifié entre les versions CTP et beta d'Atlas, de nombreuses fonctionnalités ont été supprimé :

  • Il n'est plus possible d'utiliser un type Client pour la sérialization JSON,
  • Il n'est plus possible d'obtenir le résultat d'une sérialization JSON,
  • Les JavaScriptConverter ont perdu 90% de leur utilité.

La serialization JSON était beaucoup (beaucoup!) mieux avec les anciennes CTP et j'aimerais vraiment que cela revienne comme avant !!!

Posted: jeudi 9 novembre 2006 01:37 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

Fox a dit :

Une rapide recherche dans le forum sur JavaScriptConverter donne ceci :(

http://forums.asp.net/thread/1440022.aspx

# novembre 9, 2006 10:01

Poppyto a dit :

Je voudrais pas être médisant mais à voir tous tes posts, "Atlas" ressemble à une usine à gaz ! j'hésite vraiment à m'y intéresser...

# novembre 9, 2006 10:43

cyril a dit :

Fox, j'avais parcouru ce thread qui dit a peu prés la même chose ... on est donc (au moins) 2 à raler c'est pas suffisant pour modifier les choses rapidement ? :D

Pour ceux qui n'ont pas lu le message du forum donné par Fox, voici la seule chose interessante :

"this is something we know about and have on our list of things to potentially support in the future..."

j'aime pas le "potentially in the future" ...

# novembre 9, 2006 12:17

cyril a dit :

Poppyto &gt; ce que je blog d'Atlas est "high level" si on se sert d'Atlas normalement (sans lancer Reflector ;)) on a pas ce genre de problème et c'est trés trés bien foutu :-)

# novembre 9, 2006 13:58

CLaueR a dit :

Certes, c'est ennuyeux.

En même temps, tant que les technos sont en phase de CTP ou de Bêta, c'est des choses qui peuvent arriver. Il ne faut pas s'en étonner outre mesure.

Rien n'est encore figé ! ...

# novembre 10, 2006 11:17

FREMYCOMPANY a dit :

Je n'avais jamais utilisé la fonctionnalité (ni même MS Ajax, je n'ai pas le temps de m'y mettre), mais en effet, perdre une possibilité de cette taille me semble franchement dommage... et dommageable (vu la quantité de donnée à transferer en plus...)

# novembre 11, 2006 14:57
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01

- SharePoint Online: Script PowerShell pour supprimer une colonne dans tous les sites d’une collection par Blog Technique de Romelard Fabrice le 11-27-2018, 18:01