Protocol Buffers
以下のように、polyline.protoファイルを作成する。
Pointメッセージは2つの必須フィールドxとyを定義している。labelフィールドはオプションである。それぞれのフィールドはタグ番号を持っている。このタグ番号はイコール記号「=」の後で定義される。(例: xはタグ番号 1 を持つ)。タグ番号は1以上の自然数であり、タグ番号でフィールドを識別するため、重複なく必ず指定しないといけない。
LineおよびPolylineメッセージは Protocol Buffersによる入れ子メッセージの例であり、どちらもPointを用いている。PolyLineは繰り返しフィールドpointを持ち、ベクトルとして扱う。
メッセージのフィールドにはrequired、optional、repeatedのどれかが指定可能。また、値の型としては、各種プリミティブ型の整数や浮動小数点数、bool、string、bytesを指定可能。optionalはデフォルト値を指定可能。repeatedはJavaではjava.util.Listになる。
この後、これ protocによりコンパイルし、PolyLineProtos.javaやpolyline.pb.hなどが生成される。
Javaの場合は、以下のように利用することができる。
C++の場合は、以下のように利用することができる。
通信や永続化において構造データのシリアライズは重要である。Protocol Buffers はこれを実現するための仕様およびライブラリであり、定義言語(インタフェース定義言語)・シリアライズ形式・各言語向けランタイムライブラリ・プロトコンパイラ生成コードの4要素からなる。
Protocol Buffersのデザインの目的はシンプルさとパフォーマンスである。とりわけ、XMLより高速になるようデザインされている。GoogleはXMLとの比較で、3〜10倍小さく、20〜100倍高速であると主張している。Google自身が挙げている例では、XMLでは69バイト以上の物が Protocol Buffersでは28バイトであり、XMLのパースは5〜10マイクロ秒も必要だが、Protocol Buffersのパースは0.1〜0.2 マイクロ秒で完了するとしている。
Protocol Buffersは既にあるサービス向けへの明確なRPCスタックを含まない部分を除いてFacebookによるThriftプロトコルに非常に似ている。Protocol Buffersはオープンソースであり、RPCスタックはこれらのギャップを埋めるために生まれてきた。
データ構造およびサービスはプロトコル定義ファイル (Proto Definition file (.proto)) でデザインされ、protocプログラムによりコンパイルされる。このコンパイル作業により目的のサービスに適合するコードが生成される。