Сериализация объектов в Node.js: JSON, Buffer и Protobuf

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Сериализация объектов в JavaScript (Node.js): от JSON до бинарных протоколов

Сериализация — это процесс преобразования сложных структур данных (объектов, массивов, Map, Set) в формат, который можно сохранить в файл, передать по сети или сохранить в базе данных. В Node.js эта задача стоит особенно остро, так как серверные приложения часто работают с большими объёмами данных, микросервисами и WebSocket-соединениями. В этой статье мы разберём основные инструменты и библиотеки для сериализации объектов в среде Node.js.

1. Встроенный JSON: стандарт де-факто

Модуль JSON доступен в Node.js без установки дополнительных пакетов. Он поддерживает методы JSON.stringify() и JSON.parse().

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

// Сериализация
const jsonString = JSON.stringify(user);
console.log(jsonString);
// {"name":"Анна","age":28,"skills":["JavaScript","Node.js"],"active":true}

// Десериализация
const parsedUser = JSON.parse(jsonString);
console.log(parsedUser.name); // Анна

Плюсы:

  • Человекочитаемый формат
  • Встроенная поддержка во всех средах
  • Простота отладки

Минусы:

  • Не поддерживает undefined, BigInt, Date (преобразует в строку), Map, Set
  • Медленнее бинарных форматов
  • Избыточный размер за счёт синтаксических элементов (кавычки, запятые)

2. Buffer и бинарная сериализация в Node.js

Для высокопроизводительных приложений (игры, финансовые данные, IoT) используют бинарные форматы. В Node.js для этого есть модуль Buffer.

const buf = Buffer.alloc(8);
buf.writeUInt32BE(123456, 0); // запись 4-байтового беззнакового целого
buf.writeUInt32BE(789012, 4); // второе число

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

// Чтение
const a = buf.readUInt32BE(0); // 123456
const b = buf.readUInt32BE(4); // 789012

Для сложной сериализации объектов в бинарном формате лучше использовать специализированные библиотеки.

3. Protocol Buffers (protobuf) — эффективная бинарная сериализация

Библиотека protobuf.js позволяет сериализовать объекты по схеме, описанной в .proto-файлах. Это стандарт, используемый в gRPC и многих микросервисных архитектурах.

Установка:

npm install protobufjs

Пример использования:

const protobuf = require('protobufjs');

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

  const payload = { id: 1, name: 'Иван', email: 'ivan@example.com' };
  
  // Сериализация
  const errMsg = User.verify(payload);
  if (errMsg) throw Error(errMsg);
  
  const buffer = User.encode(payload).finish();
  console.log('Бинарный буфер:', buffer);

  // Десериализация
  const decoded = User.decode(buffer);
  console.log('Декодировано:', decoded);
});

Файл user.proto:

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

Плюсы:

  • Максимальная производительность
  • Компактный размер (на 30-50% меньше JSON)
  • Строгая типизация и валидация
  • Кроссплатформенность

Минусы:

  • Требуется описание схемы (.proto)
  • Сложнее отладка (бинарные данные)
  • Необходимость синхронизации схем между сервисами

4. MessagePack — бинарный JSON

Библиотека msgpackr (или msgpack5) реализует формат MessagePack, который похож на JSON, но в бинарном виде. Он поддерживает больше типов данных, чем JSON.

npm install msgpackr
                    

Рекомендаций