Serialización de objetos en Node.js: JSON, Buffer y Protobuf

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 protocolos binarios



La serialización es el proceso de convertir estructuras de datos complejas (objetos, arrays, Map, Set) en un formato que se pueda guardar en un archivo, transmitir por la red o almacenar en una base de datos. En Node.js, esta tarea es especialmente crítica, ya que las aplicaciones de servidor a menudo trabajan con grandes volúmenes de datos, microservicios y conexiones WebSocket. En este artículo, analizaremos las principales herramientas y bibliotecas para la serialización de objetos en el entorno Node.js.



1. JSON incorporado: el estándar de facto

El módulo JSON está disponible en Node.js sin necesidad de instalar paquetes adicionales. Soporta los métodos JSON.stringify() y JSON.parse().



const user = {  name: 'Ana',  age: 28,  skills: ['JavaScript', 'Node.js'],  active: true};

// Serializaciónconst jsonString = JSON.stringify(user);console.log(jsonString);// {"name":"Ana","age":28,"skills":["JavaScript","Node.js"],"active":true}

// Deserializaciónconst parsedUser = JSON.parse(jsonString);console.log(parsedUser.name); // Ana


Ventajas:

  • Formato legible por humanos
  • Soporte incorporado en todos los entornos
  • Facilidad de depuración


Desventajas:

  • No soporta undefined, BigInt, Date (lo convierte a cadena), Map, Set
  • Más lento que los formatos binarios
  • Tamaño redundante debido a elementos sintácticos (comillas, comas)


2. Buffer y serialización binaria en Node.js

Para aplicaciones de alto rendimiento (juegos, datos financieros, IoT) se utilizan formatos binarios. En Node.js, para esto está el módulo Buffer.



const buf = Buffer.alloc(8);buf.writeUInt32BE(123456, 0); // escritura de un entero sin signo de 4 bytesbuf.writeUInt32BE(789012, 4); // segundo número

console.log(buf); // <Buffer 00 01 e2 40 00 0c 08 14>

// Lecturaconst a = buf.readUInt32BE(0); // 123456const b = buf.readUInt32BE(4); // 789012


Para la serialización compleja de objetos en formato binario, es mejor usar bibliotecas especializadas.



3. Protocol Buffers (protobuf) — serialización binaria eficiente

La biblioteca protobuf.js permite serializar objetos según un esquema descrito en archivos .proto. Este es el estándar utilizado en gRPC y muchas arquitecturas de microservicios.



Instalación:

npm install protobufjs


Ejemplo de uso:

const protobuf = require('protobufjs');

protobuf.load('user.proto').then(root => { const User = root.lookupType('userpackage.User');

const payload = { id: 1, name: 'Iván', email: 'ivan@example.com' }; // Serialización const errMsg = User.verify(payload); if (errMsg) throw Error(errMsg); const buffer = User.encode(payload).finish(); console.log('Buffer binario:', buffer);

// Deserialización const decoded = User.decode(buffer); console.log('Decodificado:', decoded);});


Archivo user.proto:

syntax = "proto3";package userpackage;message User {  int32 id = 1;  string name = 2;  string email = 3;}


Ventajas:

  • Máximo rendimiento
  • Tamaño compacto (30-50% más pequeño que JSON)
  • Tipado estricto y validación
  • Multiplataforma


Desventajas:

  • Requiere descripción del esquema (.proto)
  • Depuración más compleja (datos binarios)
  • Necesidad de sincronizar esquemas entre servicios


4. MessagePack — JSON binario

Recommendations