从本机 C++ 结构构建时是否可以优化平面缓冲区序列化?

Is it possible to optimize flatbuffers serialization when constructing from native C++ structs?

我正在使用 flatbuffers 序列化一堆 class 数据,使用来自 --gen-obj-api 的 "native struct" API 来填充 flatbuffer 对象,因为它是最简单的在我当前的代码中使用,我不太关心编写时的速度。但是,在读取端反序列化时,我使用标准的平面缓冲区 API,因为它不需要创建 C++ 对象,而且我可以直接使用指针来加快加载时间。

我的问题:

  1. 在写入端进行序列化时,我使用生成的 GeneratedClass::Pack() 方法来序列化本机结构及其所有子成员,但是似乎没有办法做到以这种方式进行优化。我的意思是像 CreateSharedString、CreateVectorOfSortedTables 等调用。理想情况下,我希望自动完成这些优化,这样我就可以利用 "map-like" 功能来按键查找元素并减少重复字符串名称的存储要求.有没有办法使用那些 Pack() API 来做到这一点?我认为可以通过在 Pack 调用之前对 std::vectors 进行排序来手动完成排序,但我看不到 SharedString 优化的任何方法。如果可以在 Pack 调用中设置一个标志来自动执行这些优化,那就太好了。

  2. 在反序列化过程中重建 std::vector 时,如何从 flatbuffer::Vector 构建?我知道有迭代器,但是 std::vectorbegin(), fbVec->end()) 不起作用,因为字符串类型是 flatbuffer 字符串,似乎没有办法使用 c_str() 选项,除非我手动循环遍历字符串。

谢谢!

  1. 是的,目前还不可能,因为这些调用是自动生成的。我们需要向字段添加属性,例如object_api: sortedobject_api: shared 提示代码生成器使用这些替代方法构建数据。您可以为此类功能制作 PR。
  2. 您不能以这种方式构造它,因为您处理的数据与 STL 表示数据的方式根本不同。获取嵌套数据的唯一方法是通过 UnPack,它目前仅适用于表格,但没有理由我们不能拥有适用于向量或字符串或其他东西的版本。现在,您必须编写一个手动循环,将每个元素转换为 std::string。如果您使用的是 C++17,vector<string_view> 会更有效,因为它不会分配任何字符串,并重用缓冲区中的现有数据。