Googleが、バイナリエンコード形式 protocol buffers の新バージョンをリリース – プログラミング言語中立、プラットフォーム中立で、通信プロトコル、データ保存などの用途のために、構造化されたデータをシリアライズ(直列化)する、拡張可能な方法である。このリリースの変更点は、変更ノートにまとめられている。
protocol buffersは、柔軟かつ効率的に、構造化されたデータをシリアライズするための自動的な方法である。XMLと比べて、小さく、速く、簡単になる。まずデータを、どのように構造化するかを考え、それから様々なデータストリームから/へ、様々な言語を使って、そのデータを簡単に読み/書きするために、特別に生成されたソースコードを使うことができる。"古い"データフォーマットと、コンパイルされた配布済みのプログラムは、そのままで、データ構造だけ更新することさえできる。
公開されている文書によれば、プロセス間やコンピュータ境界を跨る、オブジェクトをシリアライズする一般的な技術には、以下のものがある。
- ネイティブなシリアライズ、例えばJavaやC++にために使われる、言語に特有な実装を使って、オブジェクトはシリアライズされる
- 独自のシリアライズフォーマットを使ってシリアライズする
- データをXML形式にする
これらのやり方は、それぞれ固有の問題を抱えている、例えばネイティブなシリアライズでは、シリアライズのパイプの両端のプラットフォームは、シリアライズされたオブジェクトを復元できるように、同じでなければならない。XMLはよく知られているように、冗長であり、非効率なシリアライズ形式である。独自シリアライズ形式は、いくつものその形式ためだけのパーサを開発することになり、コストが高くなる。
protocol buffersの目標は、まさにこれらの問題を解くために、柔軟で、効率的な、自動化されたやり方を提供することである。protocol buffersでは、保存したいデータ構造の
.proto
フォーマット記述で書く。この記述から、protocol bufferコンパイラが、効率的なバイナリ形式で、protocol bufferデータを(出力ストリームへ)エンコードしたり、(入力ストリームから)パーシングするコードを実装したクラスを自動生成する。生成されたクラスは、protocol bufferを構成する、フィールド用のgetterとsetterを提供し、protocol bufferを一単位に、読み書きする詳細を扱う。重要なのは、protocol bufferフォーマットは、フォーマットを後で拡張できる、という考えをサポートしていて、プログラムは、古いフォーマットでエンコードされたデータも、読むことができる。
protocol buffersは、 "オブジェクト"の要素として以下のプリミティブなデータ型をサポートする。
- Base 128 Varint 表現 - int32, int64, uint32, uint64, sint32, sint64, bool, enum (Varintは、1ないし複数バイト使って、整数をシリアライズする方法で、小さな数字ほどより少ないバイト数で表わせる。)
- 固定長の64ビット表現 - fixed64, sfixed64, double
- 固定長表現 - string, bytes, 埋込みmessage(message内のmessageのこと), パックされた繰り返されるフィールド
- 固定長の32ビット表現 - fixed32, sfixed32, float
シリアライズされる単位は、messageでプリミティブなデータ型、あるいは埋込みmessageからなるフィールドを含むことができる。protocol buffersは、optional(オプション)、required(必須)、repeated(繰り返し)の3種類のフィールドをサポートする。protocol buffersを使うと、アドレス帳のmessage定義例は、以下のようになる
package tutorial; message Person { required string name = 1; required int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4; } message AddressBook { repeated Person person = 1; }
message定義言語の特徴は言語ガイドに記述されている。protocol bufferコンパイラを使ってコンパイルすると、生成されたエンコーダやパーサは、Google所有の効率的なシリアライズフォーマットを使っている。現在のリリースには、コンパイラと、C++、Java、Python用のAPIが含まれている。しかし、コミュニティプロジェクトが、Perl、C#、Rubyを含んだ他言語用に、protocol buffersの新しい実装に取り組んでいる。