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リクエスト/レスポンスラッパー、またはデータが自然に親子階層を形成するシナリオ。

試してみる — Protobuf Definition Parser

フルツールを開く