2016-12-20 6 views
6

Googleプロトコルバッファー3.0での継承の処理方法は?プロトコルバッファーの継承

Javaの同等のコード:

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

プロト同等のコードでしょうか?

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

継承はプロトコルバッファではサポートされていません。これを参照してくださいhttp://stackoverflow.com/questions/29263507/extending-protobuf-messages – Yousaf

答えて

4

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

はいえ、クラスの継承に似た施設を探して行ってはいけない - プロトコルバッファはそれをしません。

+0

なぜ彼らはそれをしないのですか?つまり、将来的にでも追加したいもののようには聞こえません。 –

+0

私はそれが効率が悪くなると思っています。ポルトバッファの中心的な特徴の1つは、物事を効率的にパックすることです。変数に割り当てられる整数の値が小さいほど、最適化されたパッキングが保証され、第2に、一意でなければなりません。現在、複数レベルの継承が作成された場合、基本構造のプロパティに割り当てられた整数を追跡することは困難です。 –

6

プロトコルバッファは継承をサポートしていません。代わりに、組成物を用いて検討します。

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

しかし、継承のようなものですあなたが使用できるトリックがある、と述べている - しかし、これは醜いハックですので、あなただけ注意して使用する必要がありますが。あなたのようなあなたのメッセージタイプ定義する場合:

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

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

継承のようなものを実装するために、これを使用することができます。 "スーパークラス"。しかし、このアプローチにはいくつ大きな問題があります。

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