Как установить поле таблицы flatbuffers с байтовым массивом - PullRequest
0 голосов
/ 18 октября 2019

Я хочу установить поле таблицы flatbuffers с байтовым значением.

То, что мне удалось до сих пор, без успеха, это следующее.

схема flatbuffers:

namespace sint.bl;

table Response {
    id:short;
    body:[byte];
}

Пример кода Python:

import flatbuffers
import pickle
import sint.bl.Request
import sint.bl.Response

my_dict = {
        'a': 1
}

my_bytes = pickle.dumps(my_dict)

builder = flatbuffers.Builder(1024)

sint.bl.Response.ResponseStart(builder)
sint.bl.Response.ResponseAddId(builder, 100)

# this line throws the exception:
# ValueError: invalid literal for int() 
# with base 10: b'\x80\x03}q\x00X\x01\x00\x00\x00aq\x01K\x01s.'
sint.bl.Response.ResponseAddBody(builder, my_bytes)

response = sint.bl.Response.ResponseEnd(builder)

builder.Finish(response)

response_pdu = builder.Output()

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

1 Ответ

1 голос
/ 18 октября 2019

Аргумент к ResponseAddBody - это смещение к сериализованному байтовому вектору (int в вашей ошибке), а не к bytes объекту напрямую. Это нужно сериализовать перед таблицей.

Итак, сразу после создания builder, вызовите builder.CreateByteVector(my_bytes), результат которого вы передаете ResponseAddBody позже.

Кроме того, здесь показано, как создать любой вектор вручную (выберите Python, найдите inventory): https://google.github.io/flatbuffers/flatbuffers_guide_tutorial.html

Обратите внимание, что вы используете 2 системы сериализации, pickle и FlatBuffers. Вам было бы лучше кодировать выбранные данные непосредственно в FlatBuffers, используя, например, table Foo { a:int } вместо вашего dict, или, если это должен быть открытый диалог, вектор table KeyValue { key:string; value:int; } или подобный. Или союз, в зависимости от вашего варианта использования.

...