Перейти к содержанию
Материалы раздела

MessagePack

Модуль для сериализации и десериализации данных в формате MessagePack. MessagePack - это эффективный бинарный формат сериализации, похожий на JSON, но более компактный и быстрый.

msgpack.pack(data)

Сериализует Lua-значение в бинарную строку формата MessagePack.

Аргументы:

  • data: значение для сериализации (число, строка, булево, таблица или nil)

Возвращает: строку с бинарными данными MessagePack

Поддерживаемые типы:

  • number - целые числа сериализуются как целые MessagePack, дробные как double
  • string - строки
  • boolean - булевы значения
  • table - таблицы (массивы или ассоциативные массивы)
  • nil - значение nil

Вложенные таблицы поддерживаются. Таблица кодируется как массив только тогда, когда её ключи образуют плотную последовательность от 1 до #table; в остальных случаях она кодируется как map.

local msgpack = require("msgpack")

-- Упаковка простых значений
local packed = msgpack.pack(123)
local packed = msgpack.pack("hello")
local packed = msgpack.pack(true)

-- Упаковка таблицы
local data = {
   key1 = "val1",
   key2 = {"a", "b"},
   key3 = false,
   key4 = 123
}
local packed = msgpack.pack(data)

msgpack.unpack(data)

Десериализует бинарную строку MessagePack в Lua-значение.

Аргументы:

  • data: строка с бинарными данными MessagePack

Возвращает: десериализованное Lua-значение

local msgpack = require("msgpack")

-- Распаковка данных
local data = {
   key1 = "val1",
   key2 = {"a", "b"},
   key3 = false,
   key4 = 123,
   key5 = {k1 = "v1", k2 = "v2"}
}

local packed = msgpack.pack(data)
local unpacked = msgpack.unpack(packed)

print(unpacked.key1)     -- val1
print(unpacked.key2[1])  -- a
print(unpacked.key3)     -- false
print(unpacked.key4)     -- 123
print(unpacked.key5.k2)  -- v2

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

local msgpack = require("msgpack")

-- Сериализация данных для передачи по сети
local sensor_data = {
    temperature = 25.5,
    humidity = 60,
    timestamp = os.time(),
    sensors = {"temp1", "hum1"}
}

-- Упаковка
local binary = msgpack.pack(sensor_data)
print("Packed size: " .. #binary .. " bytes")

-- Передача данных...

-- Распаковка на принимающей стороне
local received = msgpack.unpack(binary)
print("Temperature: " .. received.temperature)

Ошибки

msgpack.pack() вызывает исключение для неподдерживаемого Lua-типа или если не удалось увеличить выходной буфер. Усечённый пакет при этом не возвращается.

msgpack.unpack() вызывает разные исключения для незавершённых и повреждённых данных. После одного корректного объекта в строке не должно быть дополнительных байтов.

Обработка расширенных типов (EXT)

При распаковке данных с типом EXT (расширение MessagePack), модуль возвращает таблицу:

local value = msgpack.unpack(encoded_ext)
-- value.type == "ext"
-- value.ext_type -- целое число: тип расширения
-- value.data     -- строка с бинарными данными