8

要するに、任意のタイプの別のメッセージを含むprotobufメッセージを定義する方法はありますか?何かのようなもの:

message OuterMsg {
    required int32 type = 1;
    required Message nestedMsg = 2; //Any sort of message can go here
}

さまざまなprotobuf実装では、コンパイルされたメッセージが共通のMessage基本クラスから拡張されるため、これを行う方法があると思います。

それ以外の場合は、次のようなあらゆる種類のメッセージに共通のベースメッセージを作成する必要があると思います。

message BaseNestedMessage {
    extensions 1 to max;
}

そしてします

message OuterMessage {
    required int32 type = 1;
    required BaseNestedMessage nestedMsg = 2;
}

これを達成する唯一の方法ですか?

4

3 に答える 3

9

最も一般的な方法は、メッセージの種類ごとにオプションのフィールドを作成することです。

message UnionMessage
{
    optional MsgType1 msg1 = 1;
    optional MsgType2 msg2 = 2;
    optional MsgType3 msg3 = 3;
}

この手法は、Google の公式ドキュメントにも記載されており、実装全体で十分にサポートされています: https://developers.google.com/protocol-buffers/docs/techniques#union

于 2012-08-30T08:48:03.803 に答える
7

基本的に、直接ではありません。プロトコル バッファは事前に構造を知りたがっていますが、メッセージのタイプはネットワーク上に含まれていません。共通のMessage基本クラスは、共通の配管コードを提供するための実装の詳細です。プロトコル バッファーの仕様には継承が含まれていません。

したがって、限られたオプションがあります。

  • メッセージタイプごとに異なるフィールド番号を使用する
  • メッセージを個別にシリアライズし、bytes型として組み込み、「これは何?」を伝えます。情報は別々に(おそらく弁別子/列挙)

また、一部の実装ではこれをさらにサポートしている可能性があることにも注意してください。protobuf-net (C# / .NET) は、(別々に) 継承と動的メッセージ タイプ (つまり、上記のもの) の両方をサポートしますが、これは主に、その 1 つのライブラリからその 1 つのライブラリへの使用のみを目的としています。これはすべて仕様に追加されるため (ワイヤ形式に関しては 100% 有効なままです)、他の実装からのそのようなデータを解釈するのは不必要に面倒かもしれません。

于 2012-08-30T08:16:07.340 に答える