Protobufのrepeatedフィールド(配列/リスト)
protobufで配列やリスト用のrepeatedフィールドの定義方法を学びます。パックドエンコーディング、順序保証、コレクション型の一般的なパターンを解説します。
Basic Messages
詳細な説明
Repeatedフィールドの使い方
repeatedキーワードはフィールドを値の順序付きリストに変えます。ほとんどのプログラミング言語の配列、リスト、スライスに相当するprotobufの機能です。
syntax = "proto3";
message ShoppingCart {
string customer_id = 1;
repeated CartItem items = 2;
repeated string promo_codes = 3;
repeated int32 saved_item_ids = 4;
}
message CartItem {
string product_id = 1;
string name = 2;
int32 quantity = 3;
double price = 4;
}
主要な特性
- 順序が保持される: 要素はシリアライゼーションとデシリアライゼーションを通じて挿入順序を維持します。
- デフォルトは空: 要素がないrepeatedフィールドはデフォルト値(空のリスト)であり、ワイヤー上でシリアライズされません。
- パックドエンコーディング: proto3では、スカラー数値のrepeatedフィールドはデフォルトでパックドエンコーディングを使用し、フィールドタグなしですべての値を連続して格納します。ワイヤーサイズを大幅に削減します。
- null要素なし: repeatedフィールドにはnullエントリを含められません。メッセージ型の場合、各要素は完全に初期化されたメッセージです。
パックド vs アンパックド
スカラー数値型の場合、proto3はデフォルトでパックドエンコーディングを使用します:
// パックド(proto3のデフォルト): [タグ][長さ][値1][値2][値3]
// アンパックド: [タグ][値1][タグ][値2][タグ][値3]
パックドエンコーディングは多くの要素を持つrepeated数値フィールドのワイヤーサイズを30-50%削減できます。
一般的なパターン
repeatedフィールドは以下に一般的に使用されます:APIのリストレスポンス、タグやラベル、バッチ操作、時系列データポイント、権限リスト。キーバリューのセマンティクスが必要な場合は、代わりにmapフィールドの使用を検討してください。
ユースケース
検索結果、商品リスト、ユーザーアクティビティフィードなど、複数のレコードを返すAPIレスポンスやエンドポイントの定義。