BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Googleがバイナリエンコード形式「Protocol Buffers」の新バージョンをリリース

Googleがバイナリエンコード形式「Protocol Buffers」の新バージョンをリリース

原文(投稿日:2009/5/14)へのリンク

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の新しい実装に取り組んでいる。

 

この記事に星をつける

おすすめ度
スタイル

BT