Serialización de objetos en JavaScript (Node.js): desde JSON hasta formatos binarios
La serialización es el proceso de convertir una estructura de datos compleja (objeto, array, Map, Set) en un formato que se pueda guardar en un archivo, transmitir por la red o enviar a otro proceso. En Node.js, la serialización se utiliza en todas partes: desde REST API hasta la comunicación entre procesos y el almacenamiento en caché. En este artículo, analizaremos las principales herramientas y bibliotecas para la serialización en el entorno Node.js, sus fortalezas y debilidades.
1. JSON integrado: el estándar de facto
La forma más sencilla y popular es utilizar el objeto global JSON con los métodos JSON.stringify() y JSON.parse(). Es compatible de forma nativa en Node.js sin necesidad de instalar paquetes adicionales.
Ejemplo de serialización básica:
const user = { name: 'Alexey', age: 30, roles: ['admin', 'editor'], metadata: null};
// Serialización a cadenaconst jsonString = JSON.stringify(user);console.log(jsonString);// {"name":"Alexey","age":30,"roles":["admin","editor"],"metadata":null}
// Deserialización de vuelta a objetoconst parsedUser = JSON.parse(jsonString);console.log(parsedUser.name); // AlexeyLimitaciones de JSON:
- No admite funciones — los métodos del objeto se eliminarán.
- No admite referencias circulares — generará un error
Converting circular structure to JSON. - Ignora undefined, Symbol, BigInt (este último generará un error).
- Convierte Date en cadena — al deserializar no se restaura el objeto Date.
Serialización personalizada con replacer:
const data = { name: 'Test', date: new Date(), secret: 'no guardar', nested: { value: 42 }};
const json = JSON.stringify(data, (key, value) => { if (key === 'secret') return undefined; // excluir campo if (value instanceof Date) return value.toISOString(); // formatear fecha explícitamente return value;}, 2); // formato con sangría
console.log(json);2. Serialización mediante Buffer: para datos binarios
Cuando se necesita transmitir datos binarios (imágenes, archivos, protobuf), se utiliza la clase Buffer. En Node.js, Buffer permite convertir cadenas y objetos a formato binario y viceversa.
Ejemplo con Buffer y JSON:
const obj = { message: '¡Hola, mundo!' };
// Serializar a JSON, luego a 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 ...
// De vueltaconst restored = JSON.parse(buffer.toString('utf-8'));console.log(restored.message); // ¡Hola, mundo!Serialización directa de números en Buffer:
const buf = Buffer.alloc(8);buf.writeInt32LE(255, 0); // escribir entero de 32 bitsbuf.writeFloatLE(3.14, 4); // escribir float
console.log(buf); // representación binaria// Lecturaconsole.log(buf.readInt32LE(0)); // 255console.log(buf.readFloatLE(4)); // 3.1400001049041753. Biblioteca flatted: solución para referencias circulares
Si su objeto contiene referencias circulares (por ejemplo, un árbol DOM o un grafo), el JSON estándar no funcionará. La biblioteca flatted (autor — Andrea Giammarchi) resuelve este problema.
Instalación y ejemplo:
npm install flattedconst { stringify, parse } = require('flatted');
const circularObj = { name: 'Ciclo' };circularObj.self = circularObj; // referencia circular
const json = stringify(circularObj);console.log(json);// {"name":"Ciclo","self":"$1"}
const restored = parse(json);console.log(restored.name); // Cicloconsole.log(restored.self === restored); // true