2017-03-31 146 views
0

我有嵌套的Java POJO 3级,看起来像这样的模式文件:Flatbuffers:你如何构建嵌套表?

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

table FPathConnection { 
    segments:[FPathSegment]; 
} 

table FPath { 
    connections:[FPathConnection]; 
} 

当我尝试序列化的Java POJO的Flatbuffer相当于我几乎得到“嵌套serialzation不允许”每次尝试使用普通的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

您使用单个FlatBufferBuilder,但您必须在开始父母之前完成序列化儿童。

就您而言,这需要您将FPath.startFPath移至末尾,并将FPath.startConnectionsVector移至此前。这意味着您需要将每个FPathConnection的偏移量存储在临时数组中。

这将使嵌套错误消失。

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