【问题标题】:Is it possible to optimize flatbuffers serialization when constructing from native C++ structs?从本机 C++ 结构构建时是否可以优化 flatbuffers 序列化?
【发布时间】:2019-01-30 08:34:34
【问题描述】:

我正在使用 flatbuffers 序列化一堆类数据,使用来自 --gen-obj-api 的“native struct”API 来填充 flatbuffer 对象,因为它是我当前代码中最简单使用的对象,但我没有写作时同样关心速度。但是,在读取端进行反序列化时,我使用的是标准的 flatbuffer API,因为它不需要创建 C++ 对象,而且我可以直接使用指针来加快加载时间。

我的问题:

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

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

谢谢!

【问题讨论】:

标签: c++ flatbuffers


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-25
    • 2018-06-21
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多