是否可以在不重新创建整个 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/