Как сократить размер векторных плоских буферов?

#c #serialization #flatbuffers

#c #сериализация #плоские буферы

Вопрос:

Моя схема:

 table Object {
    data: [ubyte]
}
  

У меня есть следующий код:

 flatbuffers::FlatBufferBuilder fb;
std::uint8_t* data = nullptr;
const size_t size = 100;
auto vector = fb.CreateUninitializedVector(size, sizeof (std::uint8_t), amp;data);
memset(data, 1, size);
auto object = CreateObject(fb, vector);
fb.Finish(object);
  

Но я хочу создать неинициализированный вектор большего размера, чем требуется, и сократить размер вектора перед отправкой, как там:

 flatbuffers::FlatBufferBuilder fb;
std::uint8_t* data = nullptr;
const size_t reserved_size = 100;
auto vector = fb.CreateUninitializedVector(reserved_size, sizeof (std::uint8_t), amp;data);
const size_t real_size = 60;
memset(data, 1, real_size);
// How to cut vector size to real size?
auto object = CreateObject(fb, vector);
fb.Finish(object);
  

Ответ №1:

В настоящее время в API нет функции для этого, нет, и хотя для этого можно было бы добавить функцию, это немного сложно, и, как вы уже указали, это можно сделать только сразу после создания вектора (начало буфера == начало вектора). Вы могли бы открыть PR / issue в репозитории FlatBuffers для его реализации.

Еще одна проблема заключается в том, что векторы «предварительно выровнены», что означает, что если вы укажете исходный размер 101 байт, он, скорее всего, сначала запишет 3 байта заполнения (в зависимости от того, какие данные были получены до него). Если вы затем укажете новый размер как 100, начало вектора будет смещено, что невозможно. Таким образом, любая такая функция должна была бы утверждать, что разница между старым и новым размером кратна 4 (4 — это размер поля size, которое предшествует вектору).

Ответ №2:

Я думаю, что то, о чем вы спрашиваете, противоречит фундаментальной концепции плоского буфера: CreateUninitializedVector он уже зарезервировал дыру в 100 байт в вашем плоском буфере и превысил границу выделения.

Комментарии:

1. Да, я знаю. Но могу ли я изменить смещение и сократить размер вектора? Фундаментальных проблем нет, просто нужно переписать последний индекс и размер вектора. Может быть, это возможно с изменяемыми типами?

2. Я не вижу ничего подобного в API flatbufferbuilder, нет.