Flatbuffers: утверждение `off && off ‹= GetSize()' не удалось

После реализации моего кодировщика плоских буферов "снизу вверх" я получаю следующее сообщение об ошибке:

../../flatbuffers-master/include/flatbuffers/flatbuffers.h:804: flatbuffers::uoffset_t flatbuffers::FlatBufferBuilder::ReferTo(flatbuffers::uoffset_t): Assertion `off && off <= GetSize()' failed.

Я полагаю, что это может быть связано с тем, что я уничтожаю построитель после того, как записал каждый flatbuffers::Offset<MyTable> в массив, и поэтому этот построитель таблиц не может позже иметь этот набор функций, связанных с ним? Является ли наиболее эффективным способом решения этой ошибки наличие массива строителей?

В настоящее время я очищаю свой latbuffers::FlatBufferBuilder между созданием каждого flatbuffers::Offset, используя мой MyTableBuilder, потому что это предотвратило получение ошибки вложенности.

Это мой третий пост, в котором я пытаюсь понять flatbuffers, и я благодарен за вашу поддержку.


person user3235290    schedule 10.01.2017    source источник
comment
Добавление кода, который иллюстрирует то, что вы делаете в дополнение к ошибке, значительно помогло бы.   -  person tadman    schedule 11.01.2017


Ответы (1)


Вы не должны очищать FlatBufferBuilder: он отвечает за создание одного буфера и должен пережить все построители таблиц для всех таблиц, которые входят в него. Если вы очистите FlatBufferBuilder, вы отбросите все ранее сериализованные данные, и смещения станут недействительными.

Вместо этого вы должны исправить исходную «ошибку вложенности». Вы получите ошибку вложенности, если попытаетесь создать строки, векторы и подтаблицы между запуском построителя родительской таблицы и Finish. Вместо этого создайте эти элементы перед запуском построителя родительской таблицы, сохраните их смещения и только затем запустите построитель родительской таблицы.

person Aardappel    schedule 11.01.2017