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レスポンスやエンドポイントの定義。

試してみる — Protobuf Definition Parser

フルツールを開く