web-dev-qa-db-ja.com

プロトコルバッファの継承

Google Protocol Buffers 3.0での継承の処理方法

Javaの同等のコード:

public class Bar {
    String name;
}
public class Foo extends Bar {
    String id;
}

Protoの同等のコードは何でしょうか?

message Bar {
    string name = 1;
}
message Foo {
    string id = 2;
}
22
Vivek Sinha

プロトコルバッファは継承をサポートしていません。代わりに、構成の使用を検討してください。

message Foo {
  Bar bar = 1;
  string id = 2;
}

しかし、そうは言っても、継承のようなものを使用できるトリックがありますが、これはいハックなので、注意して使用する必要があります。次のようなメッセージタイプを定義する場合:

message Bar {
  string name = 1;
}
message Foo {
  string name = 1;
  string id = 2;
}

FooにはBarのフィールドのスーパーセットが含まれているため、これら2つのタイプはcompatibleです。これは、あるタイプのエンコードされたメッセージがある場合、他のタイプとしてデコードできることを意味します。 BarをタイプFooとしてデコードしようとすると、フィールドidは設定されません(デフォルト値が取得されます)。 FooをタイプBarとしてデコードする場合、フィールドidは無視されます。 (これらは、時間とともに新しいフィールドを型に追加するときに適用されるルールと同じであることに注意してください。)

これを使用して、「スーパークラス」のフィールドのコピーをすべて含む複数のタイプを持たせることで、継承のようなものを実装できます。ただし、このアプローチにはいくつかの大きな問題があります。

  • タイプFooのメッセージオブジェクトをタイプBarに変換するには、シリアル化して再解析する必要があります。キャストすることはできません。これは非効率的です。
  • スーパークラスに新しいフィールドを追加するのは非常に困難です。すべてのサブクラスにフィールドを追加し、フィールド番号の競合が発生しないようにする必要があるためです。
26
Kenton Varda

Protocol Buffer Basics チュートリアルを参照してください:

ただし、クラスの継承に似た機能を探しに行かないでください。プロトコルバッファはそうしません。

15
Andy Turner