CoderTools

Protocol Buffers ツール

Protocol Buffers メッセージのエンコード、デコード、検証

Proto スキーマ

サンプルスキーマ:

入力

スキーマを解析してメッセージタイプを選択し、フォームフィールドを生成します

出力

Protocol Buffers ドキュメント

Protocol Buffers とは?

Protocol Buffers(Protobuf)は、Google が開発した言語中立、プラットフォーム中立の拡張可能な構造化データシリアライゼーション機構です。データシリアライゼーションにおいて、XML や JSON よりも小さく、高速で、シンプルです。

主な特徴

  • 言語中立・プラットフォーム中立
  • XML/JSON より小さく高速
  • スキーマ定義による強い型付け
  • 前方互換性と後方互換性
  • 自動コード生成
  • 効率的なバイナリエンコーディング

このツールの使い方

  1. スキーマエディタに .proto スキーマ定義を入力
  2. 「スキーマを解析」をクリックしてスキーマを検証・解析
  3. 操作するメッセージタイプを選択
  4. エンコード時:JSON データを入力し、「エンコード」をクリック
  5. デコード時:バイナリデータを入力し、「デコード」をクリック
  6. 「生デコード」を使用してスキーマなしでバイナリデータを分析

ツール機能

エンコード

JSON データを Protocol Buffers バイナリ形式に変換。フォームベースの入力でデータ入力と型検証が簡単に。

デコード

Protocol Buffers バイナリデータを読み取り可能な JSON 形式に変換。Base64、16進数、C スタイル16進数入力形式をサポート。

生デコード

スキーマなしで protobuf バイナリデータを分析。デバッグ、リバースエンジニアリング、未知のメッセージ分析に便利。

フォーム入力

スキーマに基づいて入力フォームを生成するユーザーフレンドリーなインターフェース。ネストされたメッセージ、列挙型、繰り返しフィールドをサポート。

Proto 構文リファレンス

Protocol Buffers はメッセージタイプを定義するためのシンプルな構文を使用します:

syntax = "proto3";

message Person {
    string name = 1;
    int32 id = 2;
    string email = 3;
    
    enum PhoneType {
        MOBILE = 0;
        HOME = 1;
        WORK = 2;
    }
    
    message PhoneNumber {
        string number = 1;
        PhoneType type = 2;
    }
    
    repeated PhoneNumber phones = 4;
}
  • syntax: protobuf バージョン(proto2 または proto3)を指定
  • message: フィールドを持つメッセージタイプを定義
  • field: 各フィールドには型、名前、一意の番号がある
  • enum: 列挙型を定義
  • repeated: フィールドを繰り返し(配列/リスト)としてマーク
  • optional: フィールドをオプションとしてマーク(proto3)

スカラー型

Protocol Buffers は様々なスカラー型をサポート:

説明 デフォルト値
int32, int64符号付き整数(可変長エンコーディング)0
uint32, uint64符号なし整数0
sint32, sint64ZigZag エンコーディングの符号付き整数(負数に効率的)0
fixed32, fixed64固定幅符号なし整数(4 または 8 バイト)0
sfixed32, sfixed64固定幅符号付き整数(4 または 8 バイト)0
float, double浮動小数点数(32 または 64 ビット)0.0
boolブール値(true/false)false
stringUTF-8 エンコードされたテキスト文字列""
bytes任意のバイナリデータempty

ワイヤータイプ

Protobuf はワイヤータイプを使用してバイナリデータから値を読み取る方法を決定します:

ワイヤータイプ 意味 用途
0Varintint32, int64, uint32, uint64, sint32, sint64, bool, enum
164-bitfixed64, sfixed64, double
2Length-delimitedstring, bytes, embedded messages, packed repeated
532-bitfixed32, sfixed32, float

ベストプラクティス

  • 新しいプロジェクトには proto3 構文を使用 - よりシンプルで広くサポート
  • フィールド番号を安定に保つ - 既存のフィールドの番号を再利用または変更しない
  • データを明確に説明する意味のあるフィールド名を使用
  • 頻繁に使用するフィールドには番号 1-15 を予約(1 バイトで済む)
  • 配列/リストには 'repeated' キーワードを使用
  • 可能な値の固定セットを持つフィールドには列挙型を定義

よくある質問

proto2 と proto3 の違いは?

Proto3 は必須フィールドを削除して構文を簡素化 - すべてのフィールドがデフォルトでオプション。デフォルト値も変更され、スカラー型のフィールド存在検出が削除されました。新しいプロジェクトには Proto3 が推奨されます。

スキーマなしで protobuf をデコードできますか?

はい!「生デコード」機能を使用してスキーマなしでバイナリデータを分析できます。フィールド名は番号(field_1、field_2 など)で表示され、一部の型情報は曖昧な場合があります。

エンコードされたデータが期待と異なるのはなぜ?

Protobuf エンコーディングは決定的ですが、デフォルト値(0、false、空文字列)は proto3 では通常スペース節約のためエンコードされません。また、JSON のフィールド順序はバイナリエンコーディングに影響しません。

ネストされたメッセージをどう処理する?

スキーマでネストされたメッセージを定義し、ネストされた JSON オブジェクトを使用します。フォームモードでは、ネストされたフィールドボタンをクリックしてダイアログでネストデータを編集できます。

一般的なユースケース

  • マイクロサービス間通信(gRPC)
  • データストレージとキャッシング
  • 設定ファイル
  • ネットワークプロトコルと API

参考資料