c++ - 在不重新创建整个 FlatBuffers 的情况下使用(非对象)C++ API 时改变表数组

标签 c++ flatbuffers

是否可以在不重新创建整个 FlatBuffers 的情况下使用 C++(非对象)API 来改变表数组?

这是我的架构示例

table Document {
  root_layer:Layer;
  bitmaps:[Bitmap];
  subdocuments:[Document];
}

table Layer {
  id:int;
  sublayers:[Layer];
}

...

这里有趣的部分是document → root_layer → sublayers

假设我想修改整个子层数组:完全重写它,而不仅仅是替换索引处的元素。据我所知,可变性 API 只允许替换索引处的元素,而不是用新数组替换整个数组,对吧?

今天,我最终重新创建了整个文档,复制了原始文档中的所有字段,一旦我到达嵌套的 sublayers,我将其替换为新数组

有更好的方法吗?

最佳答案

不,不是真的。

使用反射 API,可以将新表附加到现有缓冲区,然后调整 vector (例如 sublayers)的大小,并使元素指向新(或旧)表。但目前没有办法删除旧表,API 使用起来非常痛苦,调整大小也很慢(复杂平面结构的就地突变很难)。

或者您可以从头开始创建一个新的缓冲区,如果您想避免自己为未修改的部分编写手动复制代码,您可以再次使用反射 API (CopyTable)或复制剩余部分的对象 API。

如果您发现您经常想要更改缓冲区的一部分而不是其余部分,也许..它们应该在 2 个不同的缓冲区中?

如果出于某种原因静态数据必须与动态数据放在同一个缓冲区中,一种方法是将静态数据放在 nested_flatbuffer 中,这样您就可以将其传输到新缓冲区单个 memcpy

平均而言,恐怕使用对象 API 是最好的选择。

关于c++ - 在不重新创建整个 FlatBuffers 的情况下使用(非对象)C++ API 时改变表数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50572428/

相关文章:

c++ - 为什么我的模板参数包不起作用?

c++ - 为什么我不能将两个字符串的总和作为参数提供给采用字符串的构造函数?

c++ - boost::static_visitor 中 operator() 的附加参数

c++ - 为什么在从 C++ 函数返回对象的情况下看不到复制构造函数被调用?

Android 如何使用 FlatBuffers 解析 JSON 文件?

c++ - FlatBuffers C++ reinterpret_cast 访问实际上是未定义的行为吗?这样做实际上可以吗?

c++ - 我需要独立于平台的 CharToOem 版本。 Boost有吗?

c - ZeroMQ C 上的简单 Flatbuffers 示例 - 通过 zmq 将结构复制到 flatbuffer 并再次返回结构

android - FlatBuffers 可以与 PHP 服务器端一起使用吗?

go - Flatbuffer mutate 不会改变字节