9

接続を介して複数のバッファタイプを送信します。簡単にするために、次のようなスキーマを想像してください。

namespace MyEvents;  

table EventOne  
{  
  id:uint;  
  timestamp:ulong;  
  adress:string;  
}  

table EventTwo  
{  
  id:uint;  
  timestamp:ulong; 
  strength:float;   
}  

union Events {EventOne, EventTwo}  

table EventHolder  
{  
  theEvent:Events;  
}  

root_type EventHolder;  

C++ と C# に必要なファイルを生成し、必要に応じてそれぞれのプロジェクトに含めます。

C++ でイベントをエンコードする方法を次に示します。ここでは、EventOne タイプのイベントを示します。

...  
uint32_t anId(645);  
uint64_t aTimestamp(1234567);  
string anAddress("00::00::45::56::47::e5");  

flatbuffers::FlatBufferBuilder builder;  
auto addressOffset= builder.CreateString(anAddress);  
auto eventOneOffset= MyEvents::CreateEventOne(builder, anId, aTimestamp, addressOfset);   

// Here is where I am confused - how to create the EventHolder object.  
// Original code I posted about - commented out, but has error.
//auto eventHolderOffset= MyEvents::CreateEventHolder(builder, MyEvents::Events_EventOne, eventOneOffset);  // Compile error here.  

auto eventHolderOffset= MyEvents::CreateEventHolder(builder, MyEvents::Events_EventOne, eventOneOffset.Union());  // No compile error here.  

builder.Finish(eventHolderOffset);  

// Access buffer pointer and size and send it on its way.  

EventHolder オブジェクトの作成に問題があることに注意してください。FlatBuffers::Offset<MyEvents::EventOne> 型のオフセットがありますが、CreateEventHolder 関数は FlatBuffers::Offset<void> 型のオフセットを取ります。

  • この手順 (union タイプのオブジェクトを含むテーブル) は、フラットバッファを使用して複数のパケット タイプを送信する適切な方法ですか? 編集:答えは「はい」のようです
  • theEvent のインサイドアウト エンコーディング ステップがありませんか? 編集:いいえ!それはうまくいきます。
  • この手順が正しい場合、型の競合を避けるために何をする必要がありますか? 編集: Aardappel が言ったように、Flatbuffers エンコーディングから C++ double 配列 + テーブル + ユニオンをデコードすると、 jump が返されます。オフセット引数に .Union() を追加する必要がありました。

どんな助けでも大歓迎です。FWIW、私は C++ でエンコードし、そこでテスト デコードを行っていますが、UDP 経由で C# アプリケーションにデータを送信して、そこで最終的なデコードを行います。そのために、パケットの型テストを行い、それに応じて解釈します。

更新: 例を見つけたところ、CreateEventHolder のオフセットの最後に Union 関数を追加する必要があることがわかりました。今行ってもいいかもしれません。

4

1 に答える 1