Как построить вектор строк в python flatbuffer? - PullRequest
0 голосов
/ 19 февраля 2020

Похоже, что документация python (также this ) для flatbuffer в настоящее время является пятнистой и иногда смешивается с API-интерфейсом c ++. Я попытался создать вектор строк следующим образом:

builder, builder2, builder3 = flatbuffers.Builder(1024), flatbuffers.Builder(1024), flatbuffers.Builder(1024)
Feature.FeatureStart(builder)
Feature.FeatureStartStringValuesVector(builder2, 1)
builder2.PrependSOffsetTRelative(builder3.CreateString('a'.encode()))
Feature.AddStringValues(builder, builder2.EndVector(1))
Feature.FeatureEnd(builder)

В строке, содержащей PrependSOffsetTRelative, я получаю сообщение об ошибке:

flatbuffers.builder.OffsetArithmeticError: flatbuffers: Арифметическая ошибка смещения c.

Я попытался заменить builder3 на builder2, или заменить builder2 / builder3 на builder, или удалить .encode (), все они привели к различным ошибкам.

Я проверил, что CreateString всегда возвращает 8, тогда как PrependSOffsetTRelative, кажется, хочет только 0 в качестве ввода. Что мне здесь не хватает? Спасибо.

Вот мой файл схемы fbs:

table Feature {
  string_values:[string];
}
root_type Feature;

1 Ответ

0 голосов
/ 19 февраля 2020

OK. Я понял. Не должно быть нескольких компоновщиков, вместо этого весь плоский буфер создается побайтно в последовательности, снизу вверх, все с использованием одного и того же компоновщика. Так что порядок вызова методов Start, End et c имеет большое значение. Следующие работы:

builder = flatbuffers.Builder(1024)
s = builder.CreateString('a')
Feature.FeatureStartStringValuesVector(builder, 1)
builder.PrependSOffsetTRelative(s)
x = builder.EndVector(1)
Feature.FeatureStart(builder)
Feature.FeatureAddStringValues(builder, x)
ret = Feature.FeatureEnd(builder)
...