【ぷろとこるばっふぁーず】

Protocol Buffers とは?

最終更新:
💡 データの構造を定義し、バイナリで保存・交換する

構造化したデータを保存・交換するための、Googleが開発した仕組み。通常は.protoファイルでメッセージの型とフィールド番号を定義し、生成コードとライブラリーでバイナリへの変換や読出しを行う。

📌 このページのポイント
構造を定義して、バイナリで交換 .proto:構造の定義 int32 a = 1; aは整数 / 番号は1 コード生成 対応言語の 読出し・書込み データ:a = 150 生成コード等で変換 08 96 01 バイナリ:3バイト 意味の解釈には対応するスキーマを使う 速度やサイズの差は、データと実装で変わる
公式の単純なメッセージ例。番号1の整数フィールドaに150を入れると、08 96 01の3バイトで表される。
ひよこ ひよこ
JSONと何が違うの?
ペンギン先生 ペンギン先生
JSONは文字で表す形式で、フィールド名などを読めるね。Protocol Buffersでは構造を定義し、バイナリ形式でデータを保存・交換できる。バイナリ中の値は、フィールド番号と型に応じた形式で記録するんだ。
ひよこ ひよこ
.protoファイルには何を書く?
ペンギン先生 ペンギン先生
メッセージ名、フィールドの名前・型・番号などを書くよ。たとえばint32 a = 1は、aという整数のフィールドに番号1を付ける。コンパイラーや対応するプラグインで、読出し・書込みに使う各言語のコードを生成するんだ。
ひよこ ひよこ
バイナリだけを見れば、フィールドの意味が分かる?
ペンギン先生 ペンギン先生
元のフィールド名やメッセージ全体の定義が、そのまま含まれるわけではないよ。型や意味を正しく解釈するには対応するスキーマが必要になる。人が確認するときは、対応するツールやテキスト表現も使えるんだ。
ひよこ ひよこ
フィールドを自由に追加・変更できる?
ペンギン先生 ペンギン先生
新しい番号でフィールドを追加するなど、互換性を保てる変更はあるよ。ただし既存の番号の変更や再利用は危険だ。削除した番号をreservedで予約するなどのルールを守り、アプリケーション側の意味や動作も確認するんだ。
ひよこ ひよこ
JSONより必ず何倍も小さく、速くなる?
ペンギン先生 ペンギン先生
コンパクトな保存や高速な解析を目指した仕組みだけど、差はデータや実装によるよ。通信や保存の目的、対応するツール、スキーマ管理の負担も考えて選ぶ。固定の倍率だけで優劣を決めないんだ。
もっと詳しく知りたい人へ

Protocol Buffersを使うと通信も暗号化される?

Protocol Buffersはデータを表す仕組みで、暗号化や相手の認証そのものを提供する通信方式ではありません。たとえばgRPCで使う場合も、接続先や認証、TLSなど通信の保護は別に設定します。バイナリで人が読みづらいことは、秘密を守る保証にはなりません。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Protocol Buffers」って出てきたら「データの構造を定義して、バイナリで保存・交換する仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Protocol Buffers / Protobuf」 = 構造化データの保存・交換に使う仕組みの名称
💬 Protocol Buffersは、定義言語、生成コード、ライブラリー、データ形式などを含む名称だよ。データを送る通信の仕組みそのものとは分けて考えるんだ。

参考資料

← 用語集にもどる