2016-05-04 12 views
3

オプションのprotobufフィールドにデフォルト値を設定して、ワイヤを介して送信されるデータを最小限に抑える必要がありますか?オプションのprotobufフィールドにデフォルト値を設定しないでください。

メッセージのバイトサイズを最小限に抑えたいと考えています。これを実現するために、私がいたと考えることができ1つの最適化:

if(message->my_optional_field() != value) 
    message->set_my_optional_field(value); 

これは、意図した値がデフォルト値に等しいので、あるときに呼び出されるhas_my_optional_field()を防止し、直列化配列に表示されるフィールドを防ぎます。これは良い練習ですか? protobufは、このような何かを箱から出していますか?

質問はhow do has_field() methods relate to default values in protobuf? と似ています。実際には、回答の1つに答えがあります。しかしその後のコメントは、この主張に異議を唱えている。

答えて

5

proto2とproto3の動作が異なります。

proto2では、「存在します」という概念はデフォルト値の概念とは別です。 proto2でフィールドをデフォルト値に設定すると、ではなく、でクリアされます。その値はデフォルトであってもワイヤを介して送信されます。 proto2では、フィールドを「設定解除」するにはclear_my_optional_field()と呼ぶ必要がありました。それはワイヤ上に送信されませんでした。 Proto3はまた、フィールドが設定されているかどうかを確認するために別のhas_my_optional_field()メソッドを持っていました。

proto3では、「存在します」という概念は削除されました。代わりに、フィールドがデフォルト値に設定されていない場合にのみ送信されます。 clear_メソッドは、デフォルトに設定するのと同じです。 has_メソッドは存在しません。さらに、proto3は設定可能なデフォルト値の概念を廃止しました。すべてのフィールドのデフォルトは0または空です。

例外:メッセージ型フィールドの場合、動作はproto3では変更されていません。これらのフィールドにはまだ存在感の概念があります。

+1

実際に面白かったです。なぜ彼らは設定可能なデフォルト値の概念を廃止したのですか?それは後退のように聞こえる。 –

+1

@MukulGupta AFAICT、彼らはProtobufsをGoの生の構造体にして、Goにコンストラクタがないことを望んでいました。それはゼロをすべて初期化します。だから彼らはprotobufを変更しました。犬はIMOを揺らす。 –