在完成之前访问 flatbuffer 构建器中的对象的最佳方法?

Best method for accessing an object in a flatbuffer builder before it is finished?

提问人:douggard 提问时间:6/11/2023 更新时间:6/11/2023 访问量:47

问:

我正在 flatbuffers 中构建一个节点,其中包含不同的对象类型和该对象的签名。

 ------------------
| Node             |
| object_sig       |
|  --------        |
| | Object |       |
|  --------        |
 ------------------

伪代码

高级别将看起来像这样。

builder := flatbuffers.NewBuilder(0)

bufs.ObjectStart(builder)
bufs.ObjectAddField(builder, field)
objectOff := bufs.ObjectEnd(builder)

obj := // TODO: get object

sig := ObjectSignFields(obj)

sigOff := builder.CreateByteVector(sig)

bufs.NodeStart(builder)
bufs.NodeAddSig(builder, sigOff)
bufs.NodeAddObject(builder, objectOff)
builder.Finish(bufs.NodeEnd(builder))

return builder.FinishedBytes()

当前方法

我想在构建器最终确定之前访问该对象。

通过阅读文档(和 Go 源代码),我想出的方法是通过将其字节缓冲区复制到新的构建器来克隆构建器。结构中有一些非公共字段不会被复制,但在调用 时不会触及这些字段。Finish()

shadow := flatbuffers.NewBuilder(0)
shadow.Bytes = make([]byte, len(builder.Bytes))
copy(shadow.Bytes, builder.Bytes)
shadow.Finish(objectOff)
obj := bufs.GetRootAsObject(shadow.FinishedBytes(), 0)

问题

在构建器最终确定之前,是否有更正式的方式来访问对象?

目前的方法会稳定吗?

平坦缓冲区

评论


答: 暂无答案