Я новичок в flatbuffers и пытаюсь создать таблицу flatbuffers с вложенным вектором.Поскольку это не может быть сделано в соответствии со спецификациями flatbuffer, я поместил внешний вектор в другую таблицу.Вот IDL плоских буферов:
namespace world;
table Point {
lat:double;
lon:double;
}
table Polygon {
vertices:[Point];
}
table Country {
id:int32;
area:[Polygon];
}
root_type Country;
Тогда я написал писатель на python:
import flatbuffers
from world import Country, Polygon, Point
b = flatbuffers.Builder(0)
polys = []
for a in range(3):
points = []
for lon, lat in [[1,2], [3,4], [5,6]][:a+1]:
Point.PointStart(b)
Point.PointAddLat(b, lat + a*10)
Point.PointAddLon(b, lon + a*10)
t = Point.PointEnd(b)
points.append(t)
points.reverse()
Polygon.PolygonStartVerticesVector(b, len(points))
for p in points:
b.PrependUOffsetTRelative(p)
vertices = b.EndVector(len(points))
Polygon.PolygonStart(b)
Polygon.PolygonAddVertices(b, vertices)
Polygon.PolygonAddExtra(b, 1)
polys.append(Polygon.PolygonEnd(b))
polys.reverse()
Country.CountryStartAreaVector(b, len(polys))
for p in polys:
b.PrependUOffsetTRelative(p)
area = b.EndVector(len(polys))
Country.CountryStart(b)
Country.CountryAddArea(b, area)
pos = Country.CountryEnd(b)
b.Finish(pos)
raw_country = b.Output()
with open("output.pb", "wb") as out:
out.write(raw_country)
Наконец, я написал читателю:
import flatbuffers
import world.Country
with open("output.pb", "rb") as inf:
buf = bytearray(inf.read())
country = world.Country.Country.GetRootAsCountry(buf, 0)
for ii in range(country.AreaLength()):
poly = country.Area(ii)
print('[',poly.VerticesLength(), end=' ')
for jj in range(poly.VerticesLength()):
v = poly.Vertices(ii)
print('[{},{}]'.format(v.Lat(), v.Lon()), end=', ')
print(']')
(извинитедля такого большого количества кода - я старался максимально упростить вещи).Итак, когда я запускаю писателя, ошибок нет, все кажется грандиозным.Когда я запускаю ридер, хотя я не получаю никаких ошибок, я также не получаю ожидаемый результат.Вместо:
[1 [2.0,1.0],]
[2 [12.0,11.0] , [14.0,13.0],]
[3 [22.0,21.0], [24.0,23.0] , [26.0,25.0],]
Я получаю:
[1 [2.0,1.0],]
[2 [14,0,13,0] , [14,0,13,0],]
[3 [26,0,25,0], [26,0,25,0] , [26.0,25.0],]
Другими словами, вместо уникальных значений в дочерних векторах я получаю повторяющиеся значения.Я написал эту же программу на C ++ и получил такой же нежелательный результат, поэтому я считаю, что это неверное понимание с плоскими буферами, а не просто опечатка.Кроме того, когда я удалил внешний вектор (и его таблицу переносов), программа работала как ожидалось.Я получил один длинный список разных значений.Кто-нибудь может увидеть, что мне не хватает?