flatbuffers
Эффективная кроссплатформенная библиотека сериализации данных, разработанная Google. Она позволяет напрямую получать доступ к сериализованным данным без предварительного парсинга или распаковки, что обеспечивает минимальные накладные расходы и высокую производительность. FlatBuffers особенно подходит для приложений с критичными требованиями к производительности, таких как игры, встраиваемые системы и распределенные системы.
Особенности
- нулевые накладные расходы при чтении — доступ к данным без десериализации;
- гибкость схем данных с обратной и прямой совместимостью;
- минимальное использование памяти — данные хранятся в компактном бинарном формате;
- поддержка множества языков программирования (C++, C#, Go, Java, Kotlin, JavaScript, PHP, Python, Rust, TypeScript);
- возможность генерации кода из схемы данных (IDL);
- отсутствие зависимостей от сторонних библиотек.
Основные компоненты
FlatBuffers состоит из нескольких ключевых компонентов, которые обеспечивают эффективную сериализацию и доступ к данным (подробнее с документацией можно ознакомиться здесь).
Схемы данных и генерация кода
Основой FlatBuffers является язык описания схем (IDL), который позволяет определять структуры данных с типами, полями и вложенными объектами. Компилятор flatc генерирует код для выбранного языка программирования на основе схемы, предоставляя типобезопасный доступ к данным.
Основные возможности схем:
- определение таблиц (tables) для гибких структур с необязательными полями;
- определение структур (structs) для плотного хранения данных фиксированного размера;
- поддержка типов данных: числа (целые, с плавающей точкой), булевы, строки, массивы, векторы, юнионы;
- пространства имен (namespaces) для организации кода;
- аннотации для настройки сериализации и генерации кода;
- включение других схем через директиву
include.
Сериализация и бинарный формат
FlatBuffers использует компактный бинарный формат, который хранит данные в плоском буфере с выравниванием. Данные записываются в обратном порядке (с конца буфера), что позволяет эффективно добавлять новые поля с сохранением обратной совместимости.
Ключевые аспекты формата:
- данные хранятся в little-endian порядке по умолчанию (настраивается);
- смещения (offsets) используются для ссылок между объектами;
- vtables (виртуальные таблицы) для эффективного доступа к полям таблиц;
- поддержка скалярных типов и строк с нулевым завершением;
- возможность прямого отображения данных из файла или памяти (memory-mapped files).
API для работы с данными
Сгенерированный код предоставляет удобный API для создания, чтения и модификации плоских буферов. API варьируется в зависимости от языка, но следует общей философии FlatBuffers: создание через построитель (builder), чтение через геттеры.
Основные операции:
CreateXxx— создание буфера через построитель с заполнением полей;GetXxx— получение доступа к уже сериализованным данным без копирования;XxxBufferHasIdentifier— проверка идентификатора буфера для безопасности;UnPack/Pack— конвертация между объектами языка и плоскими буферами (опционально);Verify— проверка целостности буфера (валидация).
Поддержка продвинутых функций
FlatBuffers предоставляет дополнительные возможности для сложных сценариев использования, включая работу с динамическими данными, рефлексию и потоковую передачу.
Расширенные функции:
- Векторы и массивы: поддержка векторов фиксированной длины (arrays) и переменной (vectors), включая вложенные векторы;
- Юнионы (Unions): для хранения данных разных типов в одном поле с тегом типа;
- Рефлексия: доступ к данным через имена полей и типов без сгенерированного кода (полезно для динамических языков или инструментов);
- JSON-совместимость: конвертация между FlatBuffers и JSON через сгенерированный парсер/сериализатор;
- Разделяемые буферы (Split buffers): разделение данных и схемы для уменьшения размера передаваемых данных;
- Грязное чтение/запись (Dirty reads/writes): возможность модификации буфера на месте с осторожностью.
Инструменты и утилиты
В комплект FlatBuffers входят инструменты для работы со схемами и данными, которые упрощают разработку и отладку.
Основные инструменты:
flatc— компилятор схем в код для разных языков, а также конвертер в/из JSON;flathash— генерация хешей для схем (для идентификации версий);libflatbuffers— библиотека времени выполнения (требуется для C++, для некоторых языков код полностью автономен).
Интеграция и использование
FlatBuffers легко интегрируется в проекты благодаря минимальным зависимостям и поддержке множества языков. Он широко используется в игровых движках (например, в Cocos2d-x и других), мобильных приложениях, системах обмена сообщениями и IoT-устройствах.
Типичные сценарии использования:
- Сохранение и загрузка игровых состояний и конфигураций;
- Сетевые протоколы для многопользовательских игр и распределенных систем;
- Обмен данными между микросервисами с минимальной задержкой;
- Хранение больших объемы структурированных данных с быстрым доступом;
- Конфигурационные файлы с высокой производительностью чтения.