Можно ли оптимизировать сериализацию flatbuffers при построении из нативных структур C ++? - PullRequest
0 голосов
/ 30 января 2019

Я использую плоские буферы для сериализации группы данных класса, используя API "native struct" из --gen-obj-api для заполнения объекта плоского буфера, так как его было проще всего использовать в моем текущем коде, и я этого не делаютак же заботиться о скорости при написании.Однако при десериализации на стороне чтения я использую стандартные API плоского буфера, поскольку для этого не требуется создавать объекты C ++, и я могу напрямую использовать указатели для более быстрого времени загрузки.

Мои вопросы:

  1. При сериализации на стороне записи я использую сгенерированные методы GeneratedClass :: Pack () для сериализации нативной структуры и всех ее подэлементов, как бы там ни былоПохоже, это не способ оптимизации.Под этим я подразумеваю вызовы, такие как CreateSharedString, CreateVectorOfSortedTables и т. Д. В идеале я хотел бы, чтобы эти оптимизации выполнялись автоматически, чтобы я мог воспользоваться возможностями «карты» для поиска элементов по ключу и снижения требований к хранилищу для повторяющихся имен строк,Есть ли способ сделать это с помощью этих API Pack ()?Я полагаю, что сортировку можно выполнить вручную, просто отсортировав std :: vectors перед вызовом Pack, но я не вижу способа обойти оптимизацию SharedString.Было бы хорошо, если бы в вызове Pack был установлен флаг, который бы автоматически выполнял эти оптимизации.

  2. При восстановлении std :: vector во время десериализации, как можно построить изflatbuffer :: Vector?Я знаю, что есть итераторы, но std :: vectorbegin (), fbVec-> end ()) не работает, потому что строковый тип - это строка flatbuffer, и, похоже, нет способа легко с использованием c_str ()вариант, если я вручную не перебираю строки.

Спасибо!

1 Ответ

0 голосов
/ 30 января 2019
  1. Да, в настоящее время это невозможно, поскольку эти вызовы генерируются автоматически.Нам нужно добавить атрибуты в такие поля, как, например, object_api: sorted или object_api: shared, чтобы намекнуть генератору кода, чтобы использовать эти альтернативные способы построения данных.Вы могли бы сделать PR для такой функциональности.
  2. Вы не можете создать его таким образом, потому что имеете дело с данными, которые принципиально отличаются от того, как STL их представляет.Единственный способ получить вложенные данные - это UnPack, который в настоящее время доступен только для таблиц, хотя нет причин, по которым у нас не может быть версии, которая работает с векторами, строками или другими вещами.На данный момент вам нужно написать ручной цикл, который превращает каждый элемент в std::string по мере продвижения.Если вы используете C ++ 17, vector<string_view> будет гораздо более эффективным, поскольку он не будет выделять какие-либо строки и повторно использовать существующие данные в буфере.
...