在使用(非对象)C ++ API而不重新创建整个平坦缓冲区时,变换表数组

时间:2018-05-28 19:21:23

标签: c++ flatbuffers

在使用C ++(非对象)API而不重新创建整个flatbuffer时,是否可以改变表的数组?

以下是我的架构的示例

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

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

...

此处有趣的部分是document → root_layer → sublayers

假设我要修改整个子图层数组:完全重写它,而不仅仅是替换索引处的元素。就我看来,Mutability API只允许替换索引处的元素,而不是用新数组替换整个数组,对吗?

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

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

不,不是真的。

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

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

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

如果由于某种原因静态数据必须与动态数据位于同一个缓冲区中,一种方法是将静态数据放在nested_flatbuffer中,这样就可以将它传输到一个带有单个{的新缓冲区{1}}。

我担心平均使用对象API是你最好的选择。