web-dev-qa-db-ja.com

そのtype.parsefrom(byte [])を使用できるようにprotobufでメッセージタイプを決定する方法

Cpp側からJava側にprotobufデータを送信しようとしています。

.protoで複数のメッセージタイプが定義されています

Cpp側では、すべてのメッセージタイプの列挙型があり、次のようにbuf出力に追加しています。

uint8_t* __temp = (uint8_t*)(buf);
*__temp++ = (type) >> 8;
*__temp = (type) & 0x00FF;

Bufに追加したこの「タイプ」を取得して、次のようなことを実現するにはどうすればよいですか。

MessageType parseFrom(byte[] data);
13

正確な要件が何であるかは明確ではありません。ただし、さまざまな種類のメッセージを送信しようとしており、受信者は受信したバイトから正しいオブジェクトを解析できるはずです。これは、以下の例に示すように実行できます。

message Message1 {
   required string a = 1;
   required string b = 2;
}

message Message2 {
   required int64 id = 1;
   required string data = 2;
}




message WrapperMessage {
    required int64 commonField = 1;
    oneof msg {
        Message1 m1 = 2;
        Message2 m2 = 3;
    }   
}

基本的に、常にWrapperMessageオブジェクトは、Message1またはMessage2オブジェクトをラップするネットワーク経由で送信されます。次に、受信側で、最初にWrapperMessageオブジェクトを解析し、次にHasFieldメソッドを使用して、ラップされたオブジェクトにm1またはm2フィールドが存在するかどうかを確認してから、Message1またはMessage2オブジェクトを解析します。

「oneof」機能は、古いバージョンのprotobufコンパイラでは使用できない場合があります。

23
Nipun Talukdar

Protobuf 3は、これを処理する新しい概念 Any を導入しました。良い説明が見つかります ここ

3
Philip Nelson