Как добавить объект flatbuffer к новому объекту?

Я понимаю, как использовать FlatBufferBuilder и конкретный построитель типов (например, MyNestedTableBuilder), чтобы получить WIPOffset, а затем использовать его для получения буфера finished_data (&[u8]). Затем я использовал get_root для получения объекта на основе буфера, так что теперь у меня есть экземпляр MyNestedTable. Затем мне нужно передать это другой функции и создать новый экземпляр таблицы с помощью нового построителя MyTable с полем add_my_nested_table. Я не вижу, как это сделать без распаковки MyNestedTable и повторной сборки (что кажется очень неэффективным). Я уверен, что есть хороший способ сделать это, просто я его не нашел, даже изучив сгенерированный код и API.

Как правило, нам нужно передавать объекты и повторно использовать их по сети или через вызовы API в Rust.


person dbschwartz    schedule 02.10.2019    source источник


Ответы (1)


MyNestedTable на самом деле не является объектом, это дескриптор данных внутри сериализованных данных (ваших [u8]), и любой доступ к полям просматривает эти данные на лету.

Ни один из базовых API для любого из языков, поддерживаемых FlatBuffers (включая Rust), не имеет сгенерированного кода, который позволяет выполнять автоматическую повторную сериализацию, поскольку в большинстве случаев это не является частой операцией (у вас уже есть сериализованные данные).

Это можно сделать с помощью дополнительного «объектного API», поддерживаемого в C++ и некоторых других языках, но пока не в Rust. Как видите, CasperN работает над таким API.

До тех пор вы можете рассмотреть возможность использования nested_flatbuffer или какой-либо другой конструкции для прямой передачи сериализованных данных туда, куда они должны идти.

person Aardappel    schedule 02.10.2019
comment
Спасибо, что так быстро ответили мне, теперь я понимаю, почему это работает именно так. Я либо перестрою новый объект, прочитав MyNestedTable, либо, возможно, сохраню байты, такие как nested_flatbuffer. - person dbschwartz; 03.10.2019