Sérialisation en .NET

Auteur du billet de blog : Nicolas Hilaire - Neotech Solutions

Nicolas Hilaire

Consultant .NET
  Publié le mardi 28 juin 2016

Artisan logiciel particulièrement intéressé par les technologies .NET. Polyvalent et curieux, je suis néanmoins à l'écoute des autres technologies du marché. MVP (Microsoft Most Valuable Professional) de 2007 à 2014, je suis également auteur d'un ouvrage pour apprendre le C#, à destination des débutants et de plusieurs MOOCs sur le C#, Windows Phone ou ASP.NET MVC...

Très pratique et relativement bien connue, la sérialisation est un principe visant à transformer un objet en mémoire en une représentation plus ou moins complexe, qui permettra de l’enregistrer sur un support physique ou de le transférer sur un réseau. L’inverse est la désérialisation qui permet de reconstruire un objet à partir d’une représentation.

Bon, c’est assez vague comme description. Grosso modo bien souvent, on a un objet avec des propriétés que l’on veut enregistrer dans un fichier afin de pouvoir le relire plus tard. Imaginons une classe Client simple, liées à une liste de commandes :

Voilà, je suis un client et j’ai passé plusieurs commandes et puis je veux enregistrer ces informations :

afin de pouvoir les relire ultérieurement. Plusieurs options s’offrent à moi.

La plus connue est la sérialisation XML qui va me permettre de transformer cet objet en une représentation XML. Cela se fait facilement avec la classe XmlSerializer :

Ceci me crée un fichier XML, facilement lisible pour nous autres humains, contenant :

Ce fichier contient donc l’état de mon objet que je vais être capable de relire grâce à la désérialisation :

Pratique !

Remarquez que l’on peut agir sur le XML généré, par exemple avec des attributs. Si je rajoute l’attribut XmlElement par exemple sur la propriété NombreDeProduits :

J’obtiendrais le XML suivant :

à la place de

On peut également agir de façon plus complexe grâce à des formateurs et en implémentant l’interface ISerializable.
Il existe aussi la sérialisation binaire, qui repose sur le même principe, mais qui produit un fichier un peu moins lisible. On utilise pour cela la classe BinaryFormatter :

Il faut cependant faire une modification sur les classes afin qu’elles soient marquées comme sérialisables :

La lecture est plus difficilement compréhensible - même si c’est faisable (le fichier n‘est pas crypté) :

Pour la désérialisation, c’est le même principe :

A noter que la sérialisation binaire du framework .NET a plutôt mauvaise presse, on lui préfèrera des bibliothèques alternatives comme protobuf https://github.com/mgravell/protobuf-net, basées sur la sérialisation binaire utilisée par Google qui est prévue pour être plus efficace et plus concise.

Pour utiliser protobuf-net, rien de plus simple, on commence par rajouter le package NuGet :

Pour que cette sérialisation soit efficace, il faut décorer nos classes à sérialiser pour indiquer notamment l’ordre de sérialisation des propriétés :

Ensuite, on utilise la sérialisation de cette façon :

Voici la tête du fichier qui accueille notre client et ses commandes :

Oh oui, c’est beaucoup plus concis ! Pour ce pauvre exemple on passe de 796 octets à 41 octets. Idéal pour faire transiter des informations sur un réseau.

Enfin, je ne pouvais pas vous parler de sérialisation, sans parler de sérialisation JSON. Et pour ce faire, nous allons utiliser JSON.NET :

Vous pouvez nettoyer vos classes de tous les attributs inutiles ; et on sérialisera de cette façon :

Le fichier JSON est plus concis que le fichier XML, mais tout aussi facile à lire :

La désérialisation se fait ainsi :

Plutôt à la mode, la sérialisation JSON est un bon compromis entre verbosité et lisibilité. Le JSON est très utilisé dans les web api, notamment celles manipulées par des clients javascript.

Remarque : pour que vos sérialisations et désérialisations se passent le mieux possible, utilisez des classes POCO très simples, avec des propriétés publiques en get et set ; et n’utilisez pas de constructeur paramétré. Avec tous ces ingrédients, le cocktail n’en sera que meilleur.

Commentaires