63

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;
}
4

2 に答える 2

83

Protocol Buffers は継承をサポートしていません。代わりに、コンポジションの使用を検討してください。

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

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

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

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

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

  • type のメッセージ オブジェクトを type に変換するにFooBar、シリアル化して再解析する必要があります。ただキャストすることはできません。これは非効率的です。
  • スーパークラスに新しいフィールドを追加するのは非常に困難です。すべてのサブクラスにフィールドを追加する必要があり、これによってフィールド番号の競合が発生しないことを確認する必要があるためです。
于 2016-12-21T05:50:57.483 に答える
37

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

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

于 2016-12-20T13:22:00.720 に答える