開発者ガイドプロトコルバッファへようこそ。プロトコルバッファは、通信、データストレージと構造化データのシリアル化の拡張方法の他の領域のための言語に中立な、プラットフォームに依存しないプロトコルです。
この文書は、主にアプリケーション開発におけるプロトコルバッファを使用するJava、C ++やPythonの開発を目指しています。プロトコルバッファに関する情報の概要は、プロトコルバッファを使用して開始する方法を教えてくれます。あなたはプロトコルバッファの内容についてより深い理解をしたい場合は、入力することができます チュートリアル や プロトコルバッファエンコーディング についての詳細を学ぶためにページを。
APIリファレンスドキュメントについては、ページを参照してください。リファレンスドキュメントは 、ここでこれらの3つの言語へのすべての参照を提供するだけでなく、.protoのために 言語 と スタイル 関連のガイダンスを提供します。
プロトコルバッファとは何ですか?
あなたがXMLにプロトコルバッファを想像することができますが、より速く、より小さく、より簡単に - プロトコルバッファは、柔軟で効率的な、自動化ツールのデータのシリアル化が構成されています。
あなたは、あなたがあなたの構造化データの読み書きに簡単に特定のコード生成ツールを使用することができ、独自のデータ構造を定義することができます。これらのデータ・ストリームの読み取りと書き込みは、データと異なるコンピュータプログラミング言語を使用して、一連のかもしれません。あなたも破壊されたプログラムの中で展開されていることができない場合には、あなたのデータ構造を更新します。
プロトコルバッファの仕事はどのようにあります
あなたは、あなたのデータをシリアル化する方法を開発する必要があります。あなたはプロト構造化データファイルを通して、あなたのメッセージを定義しています。
各プロトコルバッファメッセージが論理記録小さい情報であり、このメッセージは、名前、可変制御配列の数を含みます。メッセージを定義するいくつかの基本的な.protoファイルは、次のとおり、メッセージは、メッセージの人が含まれています。
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
;
}
|
このメッセージのフォーマットは非常に単純で見ることができます上記スルー - 各メッセージタイプは、一個の以上のユニークなフィールドが番号を付けたしている、それぞれのフィールドは名前と変数の型が含まれています。
変数を使用すると、階層構造を許可することができ、数(整数または浮動小数点)(数字)、ブール値(ブール値)、文字列(文字列)、ネイティブバイナリ(生バイト)も、他のプロトコルバッファのメッセージの種類をすることができ、あなたのデータ。
あなたは、フィールド(しなければならない、フィールドがオプションフィールド(オプションフィールド)で指定することができるフィールドが必要)とフィールド(繰り返しフィールド)を複製します。次で開始することができます プロトコルバッファ言語ガイド .protoページの定義の詳細をご覧ください。
あなたが正常にメッセージを定義したら、あなたはデータ・アクセス・クラスを生成するプロトコルバッファコンパイラ(プロトコルバッファコンパイラ)を実行するために使用する言語用に定義された.protoは、使用することができます。
各フィールドに対して、ネイティブデシリアライゼーションプロセスからクラス・データ・アクセス(例えば、名前()とSET_NAME())とバイナリデータとバイナリデータの天然の配列にアクセスする簡単な方法を提供します。
あなたは、メッセージがコンパイルされるように置くC ++言語を使用している場合は、上記の定義については、あなたが呼び出される Person
クラス。あなたは、アプリケーション内のデータを埋めるために、このクラスを使用して、データ内の人の取得したシーケンスからのデータ系列(プロトコルバッファメッセージ)データをすることができます。
コード;そして、あなたが何か似た人の人物を書くことができます。
Person person;
person.set_name(
"John Doe"
);
person.set_id(
1234
);
fstream output(
"myfile"
, ios::out | ios::binary);
person.SerializeToOstream(&output);
|
次に、あなたがメッセージを読むことができます:
fstream input(
"myfile"
, ios::in | ios::binary);
Person person;
person.ParseFromIstream(&input);
cout <<
"Name: "
<< person.name() << endl;
cout <<
"E-mail: "
<< person.email() << endl;
|
あなたは古いニュースに損傷を与えることなく、あなたのメッセージに新しいフィールドを追加することができます。新しいフィールドの取り扱い古いメッセージを完全に無視しているためです。あなたがデータ構造のためのあなたの通信プロトコルにプロトコルバッファを使用するのであれば、あなたは古いコンパイルする方法はありませんコード、または古いコードへの損傷を心配することなく、あなたのプロトコルとメッセージを拡張することができます。
あなたはアクセスできる APIリファレンスセクションの 完全なプロトコルバッファコードの理解と利用を生成するために、ページの内容を。
また、にできる プロトコルバッファエンコーディングは、 ページよりプロトコルバッファメッセージのエンコード方法を理解します。
なぜXMLを使用していません
XMLプロトコルバッファは、それはより多くの利点の一連のデータ構造を持っているため。
- より簡単に
- XML 3から10倍未満
- XMLよりも早く20から100倍
- 疎結合
- データアクセスクラスを作成するプログラムツールを使用して、クラスの数より容易なアクセス
あなたは、この人のデータ定義に話をする必要があると、あなたはXMLを使用する必要があります。
<person>
<name>John Doe</name>
<email>jdoe
@example
.com</email>
</person>
|
定義します。
メッセージ(上記のテキストでのプロトコルバッファテキスト形式として後に表示されます)。
# Textual representation of a protocol buffer.
# This is *not* the binary format used on the wire.
person {
name:
"John Doe"
}
|
上記メッセージをバイナリフォーマットプロトコルバッファ(として符号化されたときにバイナリ形式)上記テキスト未満28バイトであってもよいし、処理のために100〜200ナノ秒(ナノ秒)を必要とするかもしれません。
私たちは、上記のは、主にデバッグおよび編集のために意図人間が読めるように変換されます。
あなたはXMLを使用している場合は、上記の情報は(あなたがすべてのスペースを削除する必要が)少なくとも69バイトを必要とし、あなたは、処理のために5,000〜10,000ナノ秒(ナノ秒)が必要です。
一方、プロトコルバッファ操作は非常に簡単です:
cout <<
"Name: "
<< person.name() << endl;
cout <<
"E-mail: "
<< person.email() << endl;
|
如果使用的是 XML 的话,你需要进行下面的操作:
cout <<
"Name: "
<< person.getElementsByTagName(
"name"
)->item(
0
)->innerText()
<< endl;
cout <<
"E-mail: "
<< person.getElementsByTagName(
"email"
)->item(
0
)->innerText()
<< endl;
|
但是,protocol buffers 并不是任何时候都会比 XML 好。例如,针对基于文本的标记语言(例如,XML),protocol buffers 就不是一个很好的选项,因为你不能使用 protocol buffer 更好的在文档中进行交换。更主要的是 HTML 是人类可以阅读和编辑的。protocol buffer 也不是不可以人为的读取,但是针对原生的 protocol buffer 格式是没有办法人为进行读取和编辑的。
XML 与 HTML 一样,在某种程度上是一种自我描述数据。protocol buffer 只针对你在 .proto 文件中描述的内容进行表达。
看起来像一个解决方案,我应该如何开始呢?
Download the package – 这包中含有针对 Java, Python, 和 C++ protocol buffer 编译器源代码,和你需要进行 I/O 和测试的类。希望对你的编译器进行编译和构建,请参考代码中的 README 文件。
一旦你完成了所有的设置,请参考 tutorial 页面中的内容来选择你需要的语言——这个能够帮助你使用 protocol buffer 创建一个简单的应用程序。
介绍 proto3
在我们最新的 version 3 发行版 中推出了新的语言版本 —— Protocol Buffers language version 3(另称 proto3),在这个版本中针对我们已经存在的语言版本(proto2)使用了一些新的特性。
Proto3 简化了 protocol buffer 语言,使其更加容易使用并且能够支持更多的语言:我们当前发行的 proto3 能够让你创建 Java, C++, Python, Java Lite, Ruby, JavaScript, Objective-C, and C#。
另外你也可以通过使用 Go protoc 插件来用 proto3 创建 Go 代码,这个插件你可以到 golang/protobuf Github 中下载到。更多的语言还在逐步进行支持中。
请注意,这 2 个版本的 API 并不是完全兼容的。为了照顾还在使用老版本的用户,我们将会在新的 protocol buffers 发行中同时支持老的版本。
你可以在下面的发行日志(release notes)查看 2 个版本的主要不同。有关 proto3 的句法,请参考 Proto3 Language Guide 中的内容,针对 proto3 的完整文档还没有编写完成,将会随后推出。
看起来 proto2 和 proto3 可能会产生一些混淆,这是因为原始的开源 protocol buffers 实际上是 Google 内部语言的第二个版本,同时我们的开源版本也是从 v2.0.0 开始的。简单来说就是 proto 最开始的版本是 Google 内部使用的,在 proto 第二个版本的时候,Google 决定进行开源了,所以开源的 proto 是从 proto2 开始的。
一个简短的历史
Protocol buffers 最开始是在 Google 内部进行开发的,用于处理在索引服务器上请求/响应(request/response)的协议。
プロトコルバッファの前に、要求と応答のために、マーシャル/アンマーシャルを使用して、これはプロトコルの範囲をサポートすることができます。しかし、結果の外観は、例えば、非常に醜いです。
if
(version ==
3
) {
...
}
else
if
(version >
4
) {
if
(version ==
5
) {
...
}
...
}
|
より困難なプロトコルの新しいバージョンは、開発者が古いプロトコルは、サーバー間でどのように扱われるかを理解することができなければならないので、起動するだけでなく、新たな合意を理解することが必要になるよう合意も明確にフォーマットされました。唯一の古いものと新しいプロトコルの後、徐々に新しいプロトコルを使用するために、古い契約を交換するために理解する必要があります。
プロトコルバッファは、上記の多くの問題を解決するために設計されています。
- 比較的新しい分野は、簡単に中間サーバは、直接プロセス、データをチェックするためにデータを必要としませんが、直接データを定義する方法を理解する必要なしにデータを転送することができ、定義することができます。
- 自己記述フォーマット、より容易に追加の言語(C ++、Java(登録商標)、等)をサポートすることができます。
ただし、ユーザーは手動で、独自の処理DIAMを記述する必要があります。
システムの進化として、それは他の多くの機能や用途を獲得しました:
- 自動的に手動で書かれたコードを避けるために、シリアル化および逆シリアル化コードを生成します。
- RPC(リモートプロシージャコール)要求を使用して、短い開始に加えて、人々は、(Bigtableの中で、例えば、存在する主短期データ用)効率的な自己記述データフォーマット構造としてプロトコルバッファを使用して開始しました。
- サーバーのRPCインターフェイスは、契約文書の一部として宣言され始め、コンパイラーは、ルートクラスのプロトコル、ユーザーインターフェイスはサーバーによって実装し、それらをオーバーロードすることができますを生成します。
プロトコルバッファは、Googleのデータのための共通言語になる - 時間をかけて、Googleはすでに以上348952 .protoファイルを持っている内で定義されています。RPCは、これらのシステムで使用され、ストレージシステムは、データを格納します。
https://www.cwiki.us/display/ProtocolBuffers/Developer+Guide