FlatBuffers中成员子表是否需要调用finish方法?
FlatBuffers父子表结构中是否需要调用子表的finish方法?
不需要调用子表的finish方法,只需要对最终的根表(也就是示例里的Parent表)调用finish相关方法即可。
你代码里的fbb.finish(child);这一行完全多余,甚至会导致后续构建出错——因为finish会把当前的子表标记为整个缓冲区的根节点,后续再写入父表数据时会破坏缓冲区结构,最终生成的FlatBuffer数据是无效的。
正确的代码写法应该是这样:
table Child { ... } table Parent { c: Child; ... } FlatBufferBuilder fbb = new FlatBufferBuilder(1024); // 构建子表,得到对应的偏移量 int child = Child.createChild(fbb, ...); // 这里不需要调用fbb.finish(child) // 传入子表偏移量,构建父表 int parent = Parent.createParent(fbb, child, ...); // 仅对根表(Parent)调用finish,完成整个缓冲区的构建 Parent.finishParentBuffer(fbb, parent); // write(fbb.dataBuffer());
补充说明
FlatBufferBuilder采用反向构建的机制,子表本质上只是父表中的一个字段偏移量,不需要单独收尾。只有当所有嵌套结构都构建完成后,对根表调用finish方法,才会写入整个缓冲区的元数据(比如根节点的位置),生成完整可用的FlatBuffer数据。
内容的提问来源于stack exchange,提问作者fluter
相关产品推荐
相关产品推荐

