Node.js предоставляет несколько мощных инструментов для бинарной сериализации, которые служат аналогами JSON для работы с бинарными данными. Рассмотрим основные из них.
Базовые строительные блоки для работы с бинарными данными:
// Создание буфера
const buf = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);
// Преобразование в строку
console.log(buf.toString('hex')); // 627566666572
Хотя и не встроен напрямую, часто используется вместе с Node.js:
const protobuf = require('protobufjs');
const root = protobuf.loadSync('message.proto');
const Message = root.lookupType('Message');
const payload = { id: 1, content: 'Hello' };
const message = Message.create(payload);
const buffer = Message.encode(message).finish();
Альтернатива JSON с бинарным представлением:
const msgpack = require('msgpack-lite');
const data = { name: 'Node.js', binary: true };
const encoded = msgpack.encode(data);
const decoded = msgpack.decode(encoded);
Встроенная поддержка через модуль bson
:
const { BSON } = require('bson');
const doc = { _id: new ObjectId(), name: 'Node.js' };
const data = BSON.serialize(doc);
const deserialized = BSON.deserialize(data);
Низкоуровневый API для сериализации в формат V8:
const v8 = require('v8');
const structuredClone = obj => {
return v8.deserialize(v8.serialize(obj));
};
const obj = { a: 1, b: { c: 2 } };
const cloned = structuredClone(obj);
Особый случай передачи бинарных данных между потоками:
const { Worker, isMainThread } = require('worker_threads');
if (isMainThread) {
const worker = new Worker(__filename, {
workerData: new Uint8Array([1, 2, 3]),
transferList: [workerData.buffer]
});
}
Метод | Размер | Скорость | Человекочитаемость | Поддержка типов |
---|---|---|---|---|
JSON | Большой | Средняя | Да | Ограниченная |
BSON | Меньше | Быстрая | Нет | Расширенная |
Protocol Buffers | Малый | Очень быстрая | Нет | Строгая |
MessagePack | Малый | Быстрая | Нет | Близкая к JSON |
v8.serialize | Средний | Быстрая | Нет | Полная V8 |
Выбор инструмента зависит от требований к производительности, размерам данных и необходимости совместимости с другими системами.