SimpleBinary - Легковесная замена protobuf/flatbuffers
SimpleBinary - попытка создать простейший бинарный сериализатор, обладающий следующими свойствами:
- Легкая и простая в освоении схема описания данных.
- Возможность поддержки нескольких языков.
- Легковесность и отсутствие аллокаций в процессе работы.
Данный пакет является реализацией для C# и может использоваться в любом движке с его поддержкой,
позже будет добавлена поддержки других языков.
Схема данных
Кроссплатформенность и возможность версионирования формата данных обеспечивается генерацией кода по заранее описанной схеме.
Например, нужно описать инвентарь из предметов, имеющих идентификатор и количество:
1 | ; Описание элемент инвентаря. |
В качестве простых типов поддерживаются 1-2-4-байтные знаковые и беззнаковые типы, 4-8-байтовые числа с плавающей запятой, а так же строки с ограниченной длиной (до 64к байт).
Так же поддерживаются перечисления и коллекции как из простых, так и из пользовательских типов. Все это обернуто в пулинг и
не вызывает новых аллокаций в процессе работы.
Конфигурация генератора
Для каждого языка есть набор настроек, позволяющих управлять генерацией конечного кода. Для C# это следующие пункты:
1 | [cs] |
Тут можно указать:
- пространство имен, в которое будет завернут код.
- префикс-заголовок файла.
- настроить имя перечисления для определения типа данных в дальнейшем.
- путь до сгенерированного файла и настроить генерацию потокобезопасного варианта (медленнее, но позволяет использовать пулинг в нескольких потоках).
Генерация кода
Для кодогенерации в самом простом случае не требуется что-либо устанавливать - она работает локально в браузере, достаточно открыть html из пакета, подставить конфигурацию со схемой данных и нажать кнопку - готовый файл будет предложен к скачиванию.
Если хочется автоматизации, то она так же возможна через NodeJS из командной строки - достаточно будет указать пути до файлов настроек и все сгенерируется автоматически.
Использование в коде
Давайте сериализуем тестовый инвентарь с одним предметом:
1 | using Leopotam.SimpleBinary; |
А теперь десериализуем обратно:
1 | using Leopotam.SimpleBinary; |