Flatbuffers:你如何构建嵌套表?

时间:2017-03-31 21:36:57

标签: java flatbuffers

我在模式文件中有一个3级嵌套Java POJO:

struct FPathSegment {
    originIata:ushort;
    destinationIata:ushort;
}

table FPathConnection {
    segments:[FPathSegment]; 
}   

table FPath {
    connections:[FPathConnection];
}

当我尝试将Java POJO序列化为Flatbuffer等效时,我几乎得到了#34;不允许嵌套序列化"每次我尝试使用常见的FlatBufferBuilder构建整个对象图时都会出错。

如果整个图表中只有一个构建器,那么文档中没有任何线索可以说明?每个表/结构单独一个?如果是单独的,如何将子对象导入父对象?

有所有这些方法,比如创建/启动/添加各种向量,但没有解释构建器在那里的内容。痛苦复杂。

这是我的Java代码,我尝试将Java POJO序列化为Flatbuffers等效项:

private FPath convert(Path path) {
    FlatBufferBuilder bld = new FlatBufferBuilder(1024);

    // build the Flatbuffer object
    FPath.startFPath(bld);
    FPath.startConnectionsVector(bld, path.getConnections().size());

    for(Path.PathConnection connection : path.getConnections()) {

        FPathConnection.startFPathConnection(bld);

        for(Path.PathSegment segment : connection.getSegments()) {
            FPathSegment.createFPathSegment(bld,
                    stringCache.getPointer(segment.getOriginIata()),
                    stringCache.getPointer(segment.getDestinationIata()));
        }

        FPathConnection.endFPathConnection(bld);
    }

    FPath.endFPath(bld);
    return FPath.getRootAsFPath(bld.dataBuffer());
}

每个start()方法抛出一个" FlatBuffers:对象序列化不能嵌套"例外,无法弄清楚这是做什么的。

1 个答案:

答案 0 :(得分:2)

您使用单个FlatBufferBuilder,但必须在启动父级之前完成序列化。

在您的情况下,这需要您将FPath.startFPath移至最后,并FPath.startConnectionsVector将其移至此前。这意味着您需要将每个FPathConnection的偏移量存储在临时数组中。

这将使嵌套错误消失。

造成这种不便的原因是允许序列化过程在没有任何临时数据结构的情况下继续进行。