Protobufのネストされたメッセージ
protobufでネストされたメッセージ型を定義し、複雑なデータ構造を構成する方法。メッセージの埋め込み、スコープルール、再利用パターンを学びます。
Field Types
詳細な説明
ネストされたメッセージによるデータの構成
protobufメッセージはフィールド型として他のメッセージを含むことができ、階層的なデータ構造を作成します。メッセージを他のメッセージ内で定義(ネスト定義)して論理的にスコープすることもできます。
syntax = "proto3";
message Order {
int64 order_id = 1;
Customer customer = 2;
repeated LineItem items = 3;
ShippingInfo shipping = 4;
// ネストされたメッセージ定義
message LineItem {
string product_id = 1;
string name = 2;
int32 quantity = 3;
double unit_price = 4;
}
message ShippingInfo {
Address address = 1;
string carrier = 2;
string tracking_number = 3;
}
}
message Customer {
int64 id = 1;
string name = 2;
string email = 3;
}
message Address {
string line1 = 1;
string line2 = 2;
string city = 3;
string state = 4;
string postal_code = 5;
string country = 6;
}
ネスト vs トップレベルメッセージ
ネストされたメッセージ(別のメッセージ内で定義)は親にスコープされます。外部からはOrder.LineItemとして参照されます。型が論理的に親に所有され、他で再利用されない場合に便利です。
トップレベルメッセージ(上記のAddressのような)はファイルレベルで定義され、任意のメッセージから参照できます。型が複数のメッセージで共有される場合はトップレベル定義を使用します。
Nullセマンティクス
メッセージ型フィールドには明確な「未設定」状態(null)があります。これは常にデフォルト値を持つスカラーフィールドとは異なります。proto3では、ほとんどの言語で生成されたhas_*メソッドを使用してメッセージフィールドが設定されたかどうかを確認できます。
深さと複雑さ
ネストの深さに厳密な制限はありませんが、深くネストされた構造はシリアライゼーションのオーバーヘッドを増加させ、可読性を低下させます。最大2-3レベルのネストを目指しましょう。
ユースケース
注文と明細項目のようなドメインエンティティのモデリング、メタデータが埋め込まれたAPIリクエスト/レスポンスラッパー、またはデータが自然に親子階層を形成するシナリオ。