Сериализация объектов в 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