Sérialisation d'objets en JavaScript (Node.js) : de JSON aux formats binaires
La sérialisation est le processus de conversion d'une structure de données complexe (objet, tableau, Map, Set) en un format pouvant être sauvegardé dans un fichier, transmis sur un réseau ou envoyé à un autre processus. En Node.js, la sérialisation est utilisée partout : des API REST à la communication inter-processus et à la mise en cache. Dans cet article, nous allons passer en revue les principaux outils et bibliothèques de sérialisation dans l'environnement Node.js, leurs forces et leurs faiblesses.
1. JSON intégré : le standard de facto
La méthode la plus simple et la plus populaire consiste à utiliser l'objet global JSON avec les méthodes JSON.stringify() et JSON.parse(). Il est pris en charge nativement dans Node.js sans installation de paquets supplémentaires.
Exemple de sérialisation de base :
const user = { name: 'Alexeï', age: 30, roles: ['admin', 'editor'], metadata: null};
// Sérialisation en chaîneconst jsonString = JSON.stringify(user);console.log(jsonString);// {"name":"Alexeï","age":30,"roles":["admin","editor"],"metadata":null}
// Désérialisation en objetconst parsedUser = JSON.parse(jsonString);console.log(parsedUser.name); // AlexeïLimitations de JSON :
- Ne prend pas en charge les fonctions — les méthodes de l'objet seront supprimées.
- Ne prend pas en charge les références circulaires — provoquera une erreur
Converting circular structure to JSON. - Ignore undefined, Symbol, BigInt (ce dernier provoque une erreur).
- Convertit Date en chaîne — l'objet Date n'est pas restauré lors de la désérialisation.
Sérialisation personnalisée avec replacer :
const data = { name: 'Test', date: new Date(), secret: 'ne pas sauvegarder', nested: { value: 42 }};
const json = JSON.stringify(data, (key, value) => { if (key === 'secret') return undefined; // exclure le champ if (value instanceof Date) return value.toISOString(); // formater la date explicitement return value;}, 2); // formatage avec indentation
console.log(json);2. Sérialisation via Buffer : pour les données binaires
Lorsque vous devez transmettre des données binaires (images, fichiers, protobuf), la classe Buffer est utilisée. En Node.js, Buffer permet de convertir des chaînes et des objets au format binaire et vice versa.
Exemple avec Buffer et JSON :
const obj = { message: 'Bonjour le monde !' };
// Sérialisation en JSON, puis en Bufferconst buffer = Buffer.from(JSON.stringify(obj), 'utf-8');console.log(buffer); // <Buffer 7b 22 6d 65 73 73 61 67 65 22 3a 22 d0 9f ...
// Retourconst restored = JSON.parse(buffer.toString('utf-8'));console.log(restored.message); // Bonjour le monde !Sérialisation directe de nombres en Buffer :
const buf = Buffer.alloc(8);buf.writeInt32LE(255, 0); // écriture d'un entier 32 bitsbuf.writeFloatLE(3.14, 4); // écriture d'un float
console.log(buf); // représentation binaire// Lectureconsole.log(buf.readInt32LE(0)); // 255console.log(buf.readFloatLE(4)); // 3.1400001049041753. Bibliothèque flatted : solution pour les références circulaires
Si votre objet contient des références circulaires (par exemple, un arbre DOM ou un graphe), le JSON standard ne pourra pas les gérer. La bibliothèque flatted (auteur — Andrea Giammarchi) résout ce problème.
Installation et exemple :
npm install flattedconst { stringify, parse } = require('flatted');
const circularObj = { name: 'Cycle' };circularObj.self = circularObj; // référence circulaire
const json = stringify(circularObj);console.log(json);// {"name":"Cycle","self":"$1"}
const restored = parse(json);console.log(restored.name); // Cycleconsole.log(restored.self === restored); // true4. Protocol Buffers (protobuf)
Aussi dans la bibliothèque
gomock pour Go : guide complet avec exemples
Travailler avec les archives ZIP en TypeScript : guide complet sur JSZip et adm-zip
Traitement des images en PHP : redimensionnement, recadrage et optimisation avec GD et Imagick
Client Redis pour C# (.NET) : StackExchange.Redis