2017-03-31 4 views
0

私はスキーマファイルに次のようになりますJavaのPOJOネストされた3レベルがあります:私はFlatbuffer相当にJavaのPOJOをシリアル化しようとするとFlatbuffers:どのようにしてネストしたテーブルを作成しますか?

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

table FPathConnection { 
    segments:[FPathSegment]; 
} 

table FPath { 
    connections:[FPathConnection]; 
} 

私はかなりの「ネストされたserialzationは許可されていません」を取得私が一般的なFlatBufferBuilderを使用してこのオブジェクトグラフ全体を構築しようとするたびにエラーが発生します。

グラフ全体に対して1つのビルダーがある場合は、ドキュメントに記載する手掛かりはありません。すべてのテーブル/構造体のために別々のもの?別の場合、子オブジェクトを親にどのようにインポートしますか?

さまざまなベクターの作成/開始/追加などの方法はすべてありますが、そこに入るビルダーの説明はありません。痛いほど複雑です。 、できない例外:

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」がスローされます。ここでは

は、私がFlatbuffers相当に私のJavaのPOJOをシリアル化しようとすると、私のJavaコードでありますこれを行う方法は何かを理解してください。

答えて

1

FlatBufferBuilderを1つ使用しますが、親を起動する前に、子孫のシリアル化を完了する必要があります。

あなたの場合は、FPath.startFPathを末尾に、FPath.startConnectionsVectorをその直前に移動する必要があります。つまり、各FPathConnectionのオフセットを一時配列に格納する必要があります。

これにより、ネスティングエラーがなくなります。

この不便さの理由は、シリアル化プロセスを一時的なデータ構造なしで処理できるようにするためです。

関連する問題