I have the following classes:
namespace Message;
struct BBox {
xmin:float;
xmax:float;
ymin:float;
ymax:float;
}
table msg {
key:string;
boxes: [BBox];
}
root_type Message;
To create the object I do something such as
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)
and no error is thrown
However when I try to display the results, the key is good but the size of the vector and the content is wrong
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()
We have an open issue about the Python port not doing enough error checking: https://github.com/google/flatbuffers/issues/299
The creation of the string and the vector should happen before msgStart. also, you should use just one Builder object (use just b, not v), since the above code refers from one buffer to another, which won't work.
EDIT: the Python implementation now correctly signals an error when you try to nest vector/string/table generation. It still can't detect cross-buffer offsets however.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With