| プロトコルバッファ | |
|---|---|
| 開発者 | グーグル |
| 初回リリース | 2001年初頭(社内)[ 1 ] 2008年7月7日(公開) (2008年7月7日) |
| 安定版リリース | |
| リポジトリ | |
| 書かれた | C++、C#、Java、Python、JavaScript、Ruby、Go、PHP、Dart |
| オペレーティング·システム | どれでも |
| プラットフォーム | クロスプラットフォーム |
| タイプ | シリアル化フォーマットとライブラリ、IDLコンパイラ |
| ライセンス | BSD |
| Webサイト | プロトコルバッファ |
| プロトコルバッファ | |
|---|---|
| ファイル名拡張子 | .proto |
| インターネットメディアの種類 | アプリケーション/protobuf、アプリケーション/vnd.google.protobuf |
| 開発者 | グーグル |
| 最新リリース | 3 |
| フォーマットの種類 | インターフェース記述言語 |
| オープンフォーマット? | はい |
| フリーフォーマット? | はい |
| Webサイト | プロトコルバッファ |
プロトコルバッファ(Protobuf)は、構造化データをシリアル化するために使用される、無料かつオープンソースのクロスプラットフォームデータ形式です。ネットワークを介して相互通信するプログラムの開発や、データの保存に役立ちます。この手法は、データの構造を記述するインターフェース記述言語と、その記述から構造化データを表すバイトストリームを生成または解析するためのソースコードを生成するプログラムで構成されます。
概要
Google は社内使用のために Protocol Buffers を開発し、オープンソースライセンスの下で複数の言語用のコード ジェネレーターを提供しました。
プロトコルバッファの設計目標は、シンプルさとパフォーマンスを重視したものでした。特に、XMLよりもサイズが小さく、高速になるように設計されました。[ 3 ]
プロトコルバッファは、Googleにおいてあらゆる種類の構造化情報の保存と交換に広く利用されています。この手法は、 Googleのほぼすべてのマシン間通信に使用されているカスタムリモートプロシージャコール(RPC)システムの基盤となっています。[ 4 ]
プロトコルバッファはApache Thrift、Amazon Ion、Microsoft Bondプロトコルに似ており、 gRPCと呼ばれる定義されたサービスに使用するための具体的なRPCプロトコルスタックを提供します。[ 5 ]
データ構造スキーマ(メッセージと呼ばれる)とサービスは、proto定義ファイル(.proto)に記述され、でコンパイルされますprotoc。このコンパイルにより、これらのデータ構造の送信者または受信者が呼び出すことができるコードが生成されます。例えば、example.pb.ccとexample.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つの必須データ項目xとyを定義します。データ項目ラベルはオプションです。各データ項目にはタグがあります。タグは等号の後に定義されます。例えば、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++、Java、C#、[ 12 ]、Python [ 13 ]用のコードジェネレータを提供します。
Protobuf 3.0は、 C++、Java (低リソース環境向けの方言であるJavaNanoを含む)、Kotlin、Python、Go、Ruby、Objective-C、C#、PHP、Dart用のコードジェネレーターを提供します。[ 14 ]また、3.0.0-beta-2以降ではJavaScriptもサポートしています。[ 15 ]
サードパーティの実装としては、Ada、[ 16 ] Ballerina、[ 17 ] C、[ 18 ] [ 19 ] C++、[ 20 ] Dart、Elixir、[ 21 ] [ 22 ] Erlang、[ 23 ] Haskell、[ 24 ] JavaScript、[ 25 ] Julia、[ 26 ] Nim、[ 27 ] Perl、PHP、Prolog、[ 28 ] [ 29 ] R、[ 30 ] Rust、[ 31 ] [ 32 ] [ 33 ] Scala、[ 34 ] Swift [ 35 ]などがあります。
参照
参考文献
- ^ 「よくある質問 | プロトコルバッファ」。Google Developers 。 2016年10月2日閲覧。
- ^ 「リリース - google/protobuf」 – GitHub経由。
- ^ Eishay Smith. 「jvm-serializers ベンチマーク」 . GitHub . 2010年7月12日閲覧。
- ^ケントン・ヴァーダ「スティーブ・ヴィノスキーへの返答」2008年7月14日閲覧。
- ^ "grpc" . grpc.io. 2016年10月2日閲覧。
- ^ "text_format.h - プロトコルバッファ - Google Code" . 2012年3月2日閲覧。
- ^ 「Protoベストプラクティス | プロトコルバッファドキュメント」 。 2023年5月26日閲覧。
- ^ 「概要」 . protobuf.dev . 2023年5月28日閲覧。
- ^ 「概要」 . protobuf.dev . 2023年5月28日閲覧。
- ^ 「概要」 . protobuf.dev . 2023年5月28日閲覧。
- ^ ThirdPartyAddOns - protobuf - サードパーティ製アドオンへのリンク。 - Protocol Buffers - Googleのデータ交換形式 - Google Project Hosting . Code.google.com. 2013年9月18日閲覧。
- ^ 「C#のプロトコルバッファ」 . Code Blockage . 2017年5月12日閲覧。
- ^ 「プロトコルバッファ言語ガイド」。Google Developers 。 2016年4月21日閲覧。
- ^ 「言語ガイド(proto3)| プロトコルバッファ」。Google Developers 。2020年8月9日閲覧。
- ^ 「リリース Protocol Buffers v3.0.0-beta-2 · protocolbuffers/protobuf」 . GitHub . 2020年8月9日閲覧。
- ^ 「Ada での Google プロトコル バッファの実装」。
- ^ “Ballerina - GRPC” . 2021年11月15日時点のオリジナルよりアーカイブ。2021年3月24日閲覧。
- ^ 「Nanopb - コードサイズの小さいプロトコルバッファ」 。 2017年12月12日閲覧。
- ^ 「Cでのプロトコルバッファの実装」 GitHub 。2017年12月12日閲覧。
- ^ 「Embedded Proto - マイクロコントローラ向けProtobuf」 。 2021年8月15日閲覧。
- ^ "Protox" . GitHub . 2021年10月25日.
- ^ "プロトブフエリクサー" . GitHub。 2021年10月26日。
- ^ “トーマス・アブラハムソン/GPB” . GitHub。 2021年10月19日。
- ^ 「Proto-lens」 . GitHub . 2021年10月16日.
- ^ 「JavaScript用のプロトコルバッファ」 . github.com . 2016年5月14日閲覧。
- ^ 「ThirdPartyAddOns - protobuf - サードパーティ製アドオンへのリンク - Protocol Buffers - Googleのデータ交換形式 - Google Project Hosting」 。 2012年11月7日閲覧。
- ^ 「マクロシステムの力を活用して外部ツールに依存しない、純粋なNimでのProtobuf実装」。GitHub。2021年10月21日。
- ^ 「SWI-Prolog: Google のプロトコル バッファ ライブラリ」。
- ^ "SWI-Prolog / contrib-protobufs" . GitHub . 2022年4月21日閲覧。
- ^ "RProtoBuf" . GitHub .
- ^ “Rust-protobuf” . GitHub . 2021年10月26日.
- ^ "PROST!" . GitHub . 2025年11月14日.
- ^ “Quick-protobuf” . GitHub . 2021年10月12日.
- ^ "ScalaPB" . GitHub . 2022年9月27日閲覧。
- ^ 「Swift Protobuf」 . GitHub . 2021年10月26日.