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 -- строка с бинарными данными