Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Du 22 au 24 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !

La sérialisation et la désérialisation

Utiliser kotlinx-serialization dans les projets

Tout ce qui tourne autour de la sérialisation n’est pas inclus dans le langage Kotlin, dans le but de réduire la taille des programmes. Aussi, pour pouvoir utiliser ces concepts, il convient d’ajouter une dépendance tierce dans le fichier build.gradle.kts du projet IntelliJ IDEA. Quand on l’ouvre, ce fichier ressemble actuellement à ceci :

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile 
 
plugins {  
   kotlin("jvm") version "1.4.10" 
   application  
}  
 
group = "me.rolan" 
version = "1.0-SNAPSHOT" 
 
repositories { 
   mavenCentral() 
}  
 
dependencies {  
   testImplementation(kotlin("test-junit")) 
}  
 
tasks.withType<KotlinCompile>() { 
   kotlinOptions.jvmTarget = "1.8" 
}  
 
application {  
   mainClassName = "MainKt" } 

Avant de modifier la section dependencies, modifions la section plugins en ajoutant la ligne suivante afin de pouvoir utiliser le plug-in kotlinx-serialization dans le projet :

kotlin("plugin.serialization") version "1.4.10"...

Qu’est-ce que la sérialisation ?

La sérialisation consiste en quelque sorte à faire une photo d’un objet à un instant T. Cette photo permet de "figer" l’objet et les valeurs de ses différentes propriétés. Cette photo peut ensuite être exploitée à de multiples fins : pour sauvegarder l’objet dans un fichier et le recharger plus tard (par exemple, pour sauvegarder l’avancement d’un joueur dans un jeu vidéo et restaurer son avancement à chaque nouvelle partie), pour envoyer l’objet sur le réseau, pour passer l’objet d’un écran à un autre sur Android, etc.

La sérialisation consiste à faire une photo d’une instance précise, et non pas d’une classe. Il est donc possible de sérialiser une multitude d’instances d’une même classe.

La sérialisation n’a de sens que si elle est utilisée en complément de la désérialisation. Il s’agit tout simplement du concept inverse, à savoir construire une instance d’une classe à partir de la photo de celle-ci obtenue suite à la sérialisation.

Pour résumer, le fait de sauvegarder un objet s’appelle la sérialisation tandis que le fait de charger un objet s’appelle la désérialisation.

Tout comme...

Des solutions alternatives

Outre le plug-in kotlinx-serialization, il existe de nombreuses solutions éprouvées qui permettent de mettre en place la sérialisation et la désérialisation. Citons-en quelques-unes.

Si l’on préfère éviter d’utiliser des bibliothèques tierces, des solutions héritées du langage Java permettent de mettre en place ce que l’on appelle communément la sérialisation Java. Pour cela, deux interfaces à implémenter sont disponibles : Serializable et Externalizable.

La sérialisation Java a quelques limites et n’est pas forcément très souple dès que l’on souhaite modifier la structure d’une classe et désérialiser dans cette nouvelle structure une photo d’une version précédente. Aussi, il est tout à fait possible de se tourner vers d’autres types de sérialisations.

Par exemple, les bibliothèques tierces suivantes permettent la sérialisation et la désérialisation JSON :

  • GSON développée et maintenue par Google

  • Moshi développée et maintenue par la société Square

  • Jackson développée et maintenue par l’organisme Faster:XML

Bien qu’initialement conçues pour Java, toutes ces bibliothèques sont aujourd’hui compatibles...

La sérialisation JSON avec kotlinx-serialization

1. Qu’est-ce que JSON ?

JSON (JavaScript Object Notation) est, à l’instar de XML, une syntaxe dont l’objectif est de décrire et de structurer un ensemble de données. JSON se différencie de XML par son système de formatage. En effet, JSON utilise, non pas des balises génériques, mais deux types d’éléments : des objets composés de paires de type clé/valeur et des tableaux de valeurs.

Pour chacun de ces deux types d’éléments, les valeurs peuvent être de différentes natures : un objet, un tableau ou une valeur primitive (booléen, chaînes de caractères, nombre entier ou nombre décimal).

Dans un document JSON, un objet s’écrit entre des accolades tandis qu’un tableau s’écrit entre des crochets.

Le document JSON suivant permet de représenter une personne via son nom, son prénom et son âge.

{ 
  "firstname": "Ludovic", 
  "lastname": "ROLAND", 
  "age": 31 
} 

Chacune des propriétés est séparée de la suivante par une virgule et les clés des différentes paires sont écrites entre guillemets.

Ajoutons une nouvelle propriété complexe (c’est-à-dire un objet), à savoir une adresse composée d’un numéro et d’un nom de rue, d’un code postal et d’un nom de ville.

{ 
  "firstname": "Ludovic", 
  "lastname": "ROLAND", 
  "age": 31, 
  "address": { 
     "number": 73, 
     "name": "avenue de Wagram", 
     "zipcode": 75017, 
     "city": "PARIS" 
  } 
} 

Complexifions encore cet exemple pour représenter un tableau de plusieurs personnes, au lieu d’en représenter une seule. Comme l’élément qui se trouve à la racine du document JSON est un tableau, le document JSON commence maintenant...

En résumé

  • La sérialisation est un concept qui permet de prendre une photo d’un objet à un instant précis.

  • La désérialisation est le principe inverse : il permet de restaurer un objet à partir d’une photo de celui-ci.

  • Il existe une multitude de sérialisations possibles, comme la sérialisation Java, la sérialisation XML ou encore la sérialisation JSON.

  • Le plug-in kotlinx-serialization permet de facilement mettre en place la sérialisation et la désérialisation dans différents formats tout en proposant de nombreuses options de paramétrage.