# flatbuffers

Эффективная кроссплатформенная библиотека сериализации данных, разработанная Google. Она позволяет напрямую получать доступ к сериализованным данным без предварительного парсинга или распаковки, что обеспечивает минимальные накладные расходы и высокую производительность. FlatBuffers особенно подходит для приложений с критичными требованиями к производительности, таких как игры, встраиваемые системы и распределенные системы.

## Особенности

- нулевые накладные расходы при чтении — доступ к данным без десериализации;
- гибкость схем данных с обратной и прямой совместимостью;
- минимальное использование памяти — данные хранятся в компактном бинарном формате;
- поддержка множества языков программирования (C++, C#, Go, Java, Kotlin, JavaScript, PHP, Python, Rust, TypeScript);
- возможность генерации кода из схемы данных (IDL);
- отсутствие зависимостей от сторонних библиотек.

## Основные компоненты

FlatBuffers состоит из нескольких ключевых компонентов, которые обеспечивают эффективную сериализацию и доступ к данным (подробнее с документацией можно ознакомиться [здесь](https://google.github.io/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-устройствах.

**Типичные сценарии использования:**
- Сохранение и загрузка игровых состояний и конфигураций;
- Сетевые протоколы для многопользовательских игр и распределенных систем;
- Обмен данными между микросервисами с минимальной задержкой;
- Хранение больших объемы структурированных данных с быстрым доступом;
- Конфигурационные файлы с высокой производительностью чтения.
