プロトコルバッファ

プロトコルバッファ
開発者グーグル
初回リリース2001年初頭(社内)[ 1 ] 2008年7月7日(公開) (2008年7月7日
安定版リリース
33.2  ウィキデータで編集する / 2025年12月5日[ 2 ] (2025年12月5日
リポジトリ
書かれたC++、C#、Java、Python、JavaScript、Ruby、Go、PHP、Dart
オペレーティング·システムどれでも
プラットフォームクロスプラットフォーム
タイプシリアル化フォーマットとライブラリ、IDLコンパイラ
ライセンスBSD
Webサイトプロトコルバッファ.devWikidataで編集する
プロトコルバッファ
ファイル名拡張子
.proto
インターネットメディアの種類アプリケーション/protobuf、アプリケーション/vnd.google.protobuf
開発者グーグル
最新リリース
3
フォーマットの種類インターフェース記述言語
オープンフォーマット?はい
フリーフォーマット?はい
Webサイトプロトコルバッファ.devWikidataで編集する

プロトコルバッファProtobuf)は、構造化データをシリアル化するために使用される、無料かつオープンソースのクロスプラットフォームデータ形式です。ネットワークを介して相互通信するプログラムの開発や、データの保存に役立ちます。この手法は、データの構造を記述するインターフェース記述言語と、その記述から構造化データを表すバイトストリームを生成または解析するためのソースコードを生成するプログラムで構成されます。

概要

Google は社内使用のために Protocol Buffers を開発し、オープンソースライセンスの下で複数の言語用のコード ジェネレーターを提供しました。

プロトコルバッファの設計目標は、シンプルさとパフォーマンスを重視したものでした。特に、XMLよりもサイズが小さく、高速になるように設計されました。[ 3 ]

プロトコルバッファは、Googleにおいてあらゆる種類の構造化情報の保存と交換に広く利用されています。この手法は、 Googleのほぼすべてのマシン間通信に使用されているカスタムリモートプロシージャコール(RPC)システムの基盤となっています。[ 4 ]

プロトコルバッファはApache ThriftAmazon Ion、Microsoft Bondプロトコルに似ており、 gRPCと呼ばれる定義されたサービスに使用するための具体的なRPCプロトコルスタックを提供します。[ 5 ]

データ構造スキーマ(メッセージと呼ばれる)とサービスは、proto定義ファイル(.proto)に記述され、でコンパイルされますprotoc。このコンパイルにより、これらのデータ構造の送信者または受信者が呼び出すことができるコードが生成されます。例えば、example.pb.ccexample.pb.hは から生成されますexample.proto。これらは、内の各メッセージとサービスに対応するC++クラスを定義しますexample.proto

標準的には、メッセージはコンパクトで前方互換性と後方互換性があるものの、自己記述的ではない(つまり、外部仕様なしにフィールドの名前、意味、完全なデータ型を知る方法がない)バイナリワイヤ形式にシリアル化されます。このような外部仕様(スキーマ)をプロトコルバッファファイルに含めたり参照したりする方法は定義されていません。公式サポートされている実装にはASCIIシリアル化形式が含まれていますが[ 6 ]、この形式は自己記述的ではあるものの前方互換性と後方互換性が失われているため、人間による編集やデバッグ以外の用途には適していません。[ 7 ]

プロトコル バッファーの主な目的はネットワーク通信を容易にすることですが、そのシンプルさとスピードにより、特に将来他の言語やシステムとの相互運用性が必要になる可能性がある場合には、プロトコル バッファーはデータ中心の C++ クラスや構造体の代替として使用できます。

制限事項

Protobufには単一の仕様はありません。[ 8 ]この形式は、数メガバイトを超えず、すぐにメモリにロード/送信できる小さなデータチャンクに最適であり、ストリーミング可能な形式ではありません。[ 9 ]ライブラリは圧縮機能を提供していません。また、この形式は非オブジェクト指向言語(例: Fortran )では十分にサポートされていません。[ 10 ]

プロトコルバッファの特定の用途向けのスキーマでは、整数を使用して各フィールドを識別し、データ型とフィールド名を関連付けます。(プロトコルバッファデータにはフィールド名ではなく数値のみが含まれるため、データにフィールド名が含まれるシステムと比較して、帯域幅とストレージをある程度節約できます。)

// polyline.proto構文= "proto2" ;メッセージポイント{必須int32 x = 1 ;必須int32 y = 2 ;オプションの文字列ラベル= 3 ; }メッセージライン{必須ポイント開始= 1 ;必須ポイント終了= 2 ;オプション文字列ラベル= 3 ; }メッセージポリライン{繰り返しポイントpoint = 1 ;オプションの文字列label = 2 ; }

「Point」メッセージは、2つの必須データ項目xyを定義します。データ項目ラベルはオプションです。各データ項目にはタグがあります。タグは等号の後に定義されます。例えば、x のタグは1です。

「Line」メッセージと「Polyline」メッセージはどちらもPointを使用し、プロトコルバッファにおけるコンポジションの仕組みを示しています。Polylineには繰り返しフィールドがあるため、Polylineは(不特定の数の)点の集合のように動作します。

このスキーマは、その後、1つ以上のプログラミング言語で使用できるようにコンパイルできます。Googleは、protocC++、Java、またはPython用の出力を生成できるコンパイラを提供しています。また、他の20以上の言語に対応した言語依存の出力を生成するためのスキーマコンパイラも、他のソースから入手できます。[ 11 ]

たとえば、上記のプロトコル バッファー スキーマの C++ バージョンが生成されると、C++ ソース コード ファイル polyline.cpp は次のようにメッセージ オブジェクトを使用できます。

// polyline.cpp #include "polyline.pb.h"  // "protoc polyline.proto" を呼び出して生成Line * createNewLine ( const std :: string & name ) { // (10, 20) から (30, 40) までの線を作成します。Line * line = new Line ; line - > mutable_start () -> set_x ( 10 ); line -> mutable_start () -> set_y ( 20 ); line -> mutable_end () -> set_x ( 30 ); line -> mutable_end () -> set_y ( 40 ); line -> set_label ( name ); return line ; }Polyline * createNewPolyline () { // (10,10) と (20,20) の点を持つポリラインを作成します。Polyline * polyline = new Polyline ; Point * point1 = polyline -> add_point (); point1 -> set_x ( 10 ); point1 -> set_y ( 10 ); Point * point2 = polyline -> add_point (); point2 -> set_x ( 20 ); point2 -> set_y ( 20 ); return polyline ; }

言語サポート

Protobuf 2.0はC++JavaC#[ 12 ]Python [ 13 ]用のコードジェネレータを提供します。

Protobuf 3.0は、 C++Java (低リソース環境向けの方言であるJavaNanoを含む)、KotlinPythonGoRubyObjective-CC#PHPDart用のコードジェネレーターを提供します。[ 14 ]また、3.0.0-beta-2以降ではJavaScriptもサポートしています。[ 15 ]

サードパーティの実装としては、Ada[ 16 ] Ballerina[ 17 ] C[ 18 ] [ 19 ] C++[ 20 ] DartElixir[ 21 ] [ 22 ] Erlang[ 23 ] Haskell[ 24 ] JavaScript[ 25 ] Julia[ 26 ] Nim[ 27 ] PerlPHPProlog[ 28 ] [ 29 ] R[ 30 ] Rust[ 31 ] [ 32 ] [ 33 ] Scala[ 34 ] Swift [ 35 ]などがあります。

参照

参考文献

  1. ^ 「よくある質問 | プロトコルバッファ」。Google Developers 。 2016年10月2日閲覧
  2. ^ 「リリース - google/protobuf」GitHub経由。
  3. ^ Eishay Smith. 「jvm-serializers ベンチマーク」 . GitHub . 2010年7月12日閲覧
  4. ^ケントン・ヴァーダ「スティーブ・ヴィノスキーへの返答」2008年7月14日閲覧
  5. ^ "grpc" . grpc.io. 2016年10月2日閲覧
  6. ^ "text_format.h - プロトコルバッファ - Google Code" . 2012年3月2日閲覧
  7. ^ 「Protoベストプラクティス | プロトコルバッファドキュメント」 。 2023年5月26日閲覧
  8. ^ 「概要」 . protobuf.dev . 2023年5月28日閲覧
  9. ^ 「概要」 . protobuf.dev . 2023年5月28日閲覧
  10. ^ 「概要」 . protobuf.dev . 2023年5月28日閲覧
  11. ^ ThirdPartyAddOns - protobuf - サードパーティ製アドオンへのリンク。 - Protocol Buffers - Googleのデータ交換形式 - Google Project Hosting . Code.google.com. 2013年9月18日閲覧。
  12. ^ 「C#のプロトコルバッファ」 . Code Blockage . 2017年5月12日閲覧。
  13. ^ 「プロトコルバッファ言語ガイド」。Google Developers 。 2016年4月21日閲覧
  14. ^ 「言語ガイド(proto3)| プロトコルバッファ」。Google Developers 2020年8月9日閲覧。
  15. ^ 「リリース Protocol Buffers v3.0.0-beta-2 · protocolbuffers/protobuf」 . GitHub . 2020年8月9日閲覧。
  16. ^ 「Ada での Google プロトコル バッファの実装」
  17. ^ “Ballerina - GRPC” . 2021年11月15日時点のオリジナルよりアーカイブ2021年3月24日閲覧。
  18. ^ 「Nanopb - コードサイズの小さいプロトコルバッファ」 。 2017年12月12日閲覧
  19. ^ 「Cでのプロトコルバッファの実装」 GitHub 2017年12月12日閲覧
  20. ^ 「Embedded Proto - マイクロコントローラ向けProtobuf」 。 2021年8月15日閲覧
  21. ^ "Protox" . GitHub . 2021年10月25日.
  22. ^ "プロトブフエリクサー" . GitHub。 2021年10月26日。
  23. ^ “トーマス・アブラハムソン/GPB” . GitHub。 2021年10月19日。
  24. ^ 「Proto-lens」 . GitHub . 2021年10月16日.
  25. ^ 「JavaScript用のプロトコルバッファ」 . github.com . 2016年5月14日閲覧
  26. ^ 「ThirdPartyAddOns - protobuf - サードパーティ製アドオンへのリンク - Protocol Buffers - Googleのデータ交換形式 - Google Project Hosting」 。 2012年11月7日閲覧
  27. ^ 「マクロシステムの力を活用して外部ツールに依存しない、純粋なNimでのProtobuf実装」。GitHub2021年10月21日。
  28. ^ 「SWI-Prolog: Google のプロトコル バッファ ライブラリ」
  29. ^ "SWI-Prolog / contrib-protobufs" . GitHub . 2022年4月21日閲覧
  30. ^ "RProtoBuf" . GitHub .
  31. ^ “Rust-protobuf” . GitHub . 2021年10月26日.
  32. ^ "PROST!" . GitHub . 2025年11月14日.
  33. ^ “Quick-protobuf” . GitHub . 2021年10月12日.
  34. ^ "ScalaPB" . GitHub . 2022年9月27日閲覧
  35. ^ 「Swift Protobuf」 . GitHub . 2021年10月26日.