用flatbuffers编写struct的向量

时间:2015-11-02 16:19:24

标签: python flatbuffers

我有以下课程:

命名空间消息;

b = flatbuffers.Builder(0)
msg.msgStart(b)
msg.msgAddKey(b, b.CreateString(key))

v = flatbuffers.Builder(0)
size = len(boxes)
msg.msgBoxesVector(v, size)
for elem in boxes:
    xmin, ymin, xmax, ymax = elem
    BBox.CreateBBox(v, xmin, xmax, ymin, ymax)
boxes = v.EndVector(size)
msg.msgAddBoxes(b, boxes)
obj = msg.msgEnd(b)
b.Finish(obj)

要创建对象,我会执行诸如

之类的操作
rep = msg.msg.GetRootAsmsg(bytearray(b.Output()), 0)
print rep.BoxesLength()  # give me 4 instead of 1 
for i in range(rep.BoxesLength()):
    print rep.Boxes(i).Xmin(),  rep.Boxes(i).Ymin()
    print rep.Boxes(i).Xmax(),  rep.Boxes(i).Ymax()

并且不会抛出任何错误

然而,当我尝试显示结果时,关键是好的但是矢量的大小和内容是错误的

insert into table1(a,b) (select a1,b1 from table2),(select a2,b2 from table2)

2 个答案:

答案 0 :(得分:3)

我们有一个关于Python端口没有做足够错误检查的公开问题:https://github.com/google/flatbuffers/issues/299

字符串和向量的创建应该在msgStart之前发生。此外,您应该只使用一个Builder对象(仅使用b,而不是v),因为上面的代码从一个缓冲区引用到另一个缓冲区,这将无效。

编辑:当您尝试嵌套向量/字符串/表生成时,Python实现现在正确地发出错误信号。但它仍然无法检测到交叉缓冲区偏移。

答案 1 :(得分:2)

我将给予我所做的一切,希望它可以帮助其他人(基于Aardappel的回答)

b = flatbuffers.Builder(0)

if boxes:
    boxesOffsets = 0
    msg.msgStartBoxesVector(b, len(boxes))
    for elem in boxes:
        xmin, ymin, xmax, ymax = elem
        BBox.CreateBBox(b, float(xmin), float(xmax), float(ymin), float(ymax))
    boxesOffsets = b.EndVector(len(boxes))

msg.msgStart(b)
msg.msgAddKey(b, b.CreateString(key))
msg.msgAddUrl(b, b.CreateString(url))
msg.msgAddCountry(b, b.CreateString(country))
msg.msgAddLimit(b, limit)

if boxes:
    msg.msgAddBoxes(b, boxesOffsets)

obj = msg.msgEnd(b)
b.Finish(obj)