Парсер MessagePack
MessagePack — это эффективный формат двоичной сериализации, похожий на JSON, но меньше и быстрее. Используется в Redis, Fluentd и многих RPC-системах. Этот инструмент разбирает файлы MessagePack и отображает содержимое как JSON с метаданными о типах и размерах.
Спецификации
Типичные сценарии использования
- Отладка ответов API, закодированных в MessagePack
- Просмотр кешированных данных Redis, сериализованных в MessagePack
- Анализ сообщений логов Fluentd
- Конвертация MessagePack в JSON для логирования или отладки
- Понимание полезных нагрузок RPC в формате MessagePack
Возможности
- Разбор двоичных файлов MessagePack через перетаскивание или выбор файла
- Декодирование hex-кодированных данных MessagePack
- Поддержка всех типов MessagePack, включая расширения
- Конвертация в JSON для удобства чтения
- Показ метаданных документа (размер, количество типов, максимальная глубина)
- Отображение информации о типах расширений
- Обработка двоичных данных и временных меток
- Hex-просмотрщик для инспекции сырых двоичных данных
Примеры
Простой MessagePack
Попробовать →MessagePack map с двумя полями: {"hello":"world","count":42}
82 a5 68 65 6c 6c 6f a5 77 6f 72 6c 64 a5 63 6f 75 6e 74 2aHex-кодированный MessagePack
Попробовать →MessagePack map со строкой, числом и логическим значением: {"name":"Alice","age":30,"active":true}
83 a4 6e 61 6d 65 a5 41 6c 69 63 65 a3 61 67 65 1e a6 61 63 74 69 76 65 c3Советы
- Вы можете вставить hex-кодированные данные MessagePack напрямую для их разбора.
- MessagePack обычно составляет 50-80% от размера эквивалентного JSON.
- Типы расширений (отрицательные коды типов) определяются приложением.
- Временные метки используют тип расширения -1 с различными форматами точности.
- Некоторые реализации используют тип расширения 1 для временных меток.
Описание Парсер MessagePack
MessagePack — это формат двоичной сериализации, цель которого — быть максимально компактным при сохранении совместимости модели данных с JSON. Созданный Садаюки Фурухаси, MessagePack кодирует данные в самоописывающий двоичный формат, где информация о типах и данные чередуются, обеспечивая эффективный разбор без внешней схемы.
Формат использует схему кодирования переменной длины. Маленькие целые числа (0-127) помещаются в один байт. Короткие строки включают свою длину в байт типа. Карты и массивы используют компактные префиксы длины. Такой дизайн обычно даёт полезные нагрузки размером 50-80% от эквивалентного JSON, с значительно более быстрой сериализацией и десериализацией благодаря отсутствию накладных расходов на текстовый разбор.
MessagePack поддерживает nil, boolean, integer (знаковые и беззнаковые до 64 бит), float (32 и 64 бита), string, binary, array, map и типы расширений. Типы расширений позволяют приложениям определять пользовательские типы — расширение timestamp (тип -1) является единственным стандартизированным расширением. Библиотеки существуют для практически каждого языка программирования с согласованной межъязыковой совместимостью.
MessagePack используется в Redis (как необязательный формат сериализации), Fluentd (пересылка логов), SignalR (веб в реальном времени) и многих RPC-системах и протоколах сетевого взаимодействия игр, где пропускная способность и скорость разбора имеют значение. Это хороший выбор, когда желательна совместимость с JSON, но накладные расходы текстовой сериализации слишком велики.
MessagePack лучше всего подходит для сценариев, где критичны пропускная способность или скорость разбора: коммуникация в реальном времени, высоконагруженные API, сетевое взаимодействие в играх, устройства IoT и слои кеширования. JSON остаётся лучшим выбором, когда важна человекочитаемость, для файлов конфигурации или при взаимодействии с системами, ожидающими текстовые форматы.
По сравнению с Protocol Buffers MessagePack не требует схемы, как и JSON — данные самоописывающие и могут быть сериализованы без предопределённой схемы. Protocol Buffers требуют файл схемы .proto, компилируемый в код для конкретного языка, но дают меньшие полезные нагрузки и обеспечивают более строгую типобезопасность. MessagePack лучше подходит для динамических данных без схем, тогда как Protobuf превосходен для чётко определённых API-контрактов, где нужна максимальная эффективность.
Типы расширений позволяют приложениям определять пользовательские типы данных помимо встроенного набора. Каждое расширение имеет код типа (от -128 до 127) и произвольные двоичные данные. Расширение timestamp (тип -1) — единственное стандартизированное расширение, представляющее временные метки с точностью до наносекунд. Приложения могут определять собственные расширения для типов UUID, BigDecimal или доменно-специфичных объектов.