Serialización de objetos en JavaScript (Node.js): guía completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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); // Alexey


Limitaciones 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.140000104904175


3. 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 flatted


const { 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


4. Protocol Buffers (protobuf)

Recommendations