google protobuf学習ノート2:使用と原理

4302 ワード

転載を歓迎します。転載は原文の住所を明記してください。http://blog.csdn.net/majianfei1023/article/details/45112415
Windows下でgoogle protobuf開発環境配置:http://blog.csdn.net/majianfei1023/article/details/45371743
一.protobufとは?
protobufはすべてGoogle Protocol Buffersと呼ばれています。googleが開発したデーターストアで、ネットワーク通信の際にプロトコルで復号化するためのツールライブラリです。XMLやJSONとほぼ同じで、つまり何らかのデータ構造の情報を、ある形式(XML、JSON)で保存しています。プロトブフはXMLとJSONとは違って、プロトブフはバイナリに基づいています。主にデータストア、転送プロトコルフォーマットなどの場合に用いられます。XMLなどのツールがあるのに、なぜプロトブを開発しますか?主に性能のため、時間オーバーヘッドと空間オーバーヘッドを含む。
1.時間オーバーヘッド:XMLフォーマット(プログレッシブ)とXML解析(アンチプログレッシブ)の時間的な出費はとても大きいです。多くの時間的性能が要求されている場合、あなたができるのはXMLを見て目を見張ることです。
2.空間オーバーヘッド:XML文法に詳しい学生は知っているはずです。XMLフォーマットはより良い可読性を得るために、冗長なテキスト情報を導入しました。だから、スペースの支出もあまりよくないです。
実験によると(もちろん私の実験ではない)、一つのメッセージのデータは、プロトbufでプロトタイプ化した後のサイズはjsonフォーマットの10分の1、xmlフォーマットの20分の1です。
この記事は主にプロトブフをデータストアとして使用し、次の講義はrpc通信プロトコルとして使用します。
二.protobufを使う
私は言語の特性しか話せませんので、環境設定などについては、みなさんにお願いします。http://blog.csdn.net/majianfei1023/article/details/45371743。
protobufの使用はとても簡単で、開発者は一定の文法によって構造化されたメッセージフォーマットを定義して、自分でコンパイルツールを使って、ツールは自動的に関連する種類を生成します。公式はjava、c+、python言語環境を支持します。これらのクラスをプロジェクトに含めることによって、関連する方法を簡単に呼び出すことができ、トラフィック・メッセージの順序付けと逆順序化の作業を行うことができる。
1.新聞の書式を定義します。protobufファイルの拡張子はprotoで、c++またはjavaのような文法です。protoc.exe(windowsプラットフォームの下で、ソースコードのコンパイルをダウンロードしてもいいです。インターネットで直接exeをダウンロードしてもいいです。これはみんな自分でGoogle)でprotoファイルをc+、javaまたはPythonにコンパイルして使えます。
package tutorial;

message Person {
  required string name = 1;
  required int32 age = 2;
  optional string email = 3;

}
ここでPersonを定義しました。私たちはただ簡単にname、age、emailを定義しました。ここで、上記の例では、packageの名前はtutorialといい、c+++に相当するnamespaceは、3つのメンバー、タイプはstringのname、タイプはint 32のメンバーageとタイプはstringのemailであるメッセージPersonを定義している。optional代表これはオプションのメンバーであり、すなわちメッセージにはこのメンバーを含まなくてもいいし、required代表は必須である。
プロトを作成した後、プロトをプロトコc.exeと同じディレクトリに置いて、このカタログで使用する命令:protoc--cpp_out=d:\proto person.proto(私たちが使っているのはc++)です。protocolbufferコンパイラで実行します。protoファイルの場合、コンパイラは選択された言語のコードを生成します。これらのコードは、プロファイルで定義されたメッセージの種類を操作して、フィールドの値を取得したり、設定したりして、メッセージを出力ストリームに順番に並べたり、入力ストリームからメッセージを解析します。
生成されたヘッダファイルで、C++クラスのPersonを定義し、googleから引き継ぎます。protobuf:Message、後にPersonデータのファイルを読み書きします。この種類を使ってメッセージを操作します。メッセージのメンバの値付け、メッセージの順序付けなど、それぞれの方法がある。
まず、データをdiskに書き込みます。
#include 
#include
#include "person.pb.h"

#pragma comment(lib, "libprotobuf.lib")
#pragma comment(lib, "libprotoc.lib")

using namespace std;
using namespace tutorial;

int main()
{
	Person person;

	person.set_name("flamingo");   
	person.set_age(18); 
	person.set_email("[email protected]");

	// Write
	fstream output("./log", ios::out | ios::trunc | ios::binary);

	if (!person.SerializeToOstream(&output)) {
		cerr << "Failed to write msg." << endl;
		return -1;
	}

	system("pause");
	return 0;
}
namespace tutorialは私達の前に定義したpackageです。まずPersonを定義してからPersonに値を割り当てます。その中でset_name,set_メッセージemailはprotoによって自動的に生成されたものです。Serialize Tostreamを使って対象シーケンスをバイナリにします。(読み取り可能性の悪い問題を引き起こしました。これはprotobufの欠点ですよね。)後にfstreamストリームを書き込みます。
その後、diskからPersonのデータを読み出す。
#include 
#include
#include "person.pb.h"

#pragma comment(lib, "libprotobuf.lib")
#pragma comment(lib, "libprotoc.lib")

using namespace std;
using namespace tutorial;

void PrintInfo(const Person & person) { 
	cout << person.name() << endl; 
	cout << person.age() << endl; 
	cout << person.email() << endl;
} 

int main()
{
	Person person;  

	fstream input("./log", ios::in | ios::binary);
	
	if (!person.ParseFromIstream(&input)) {
		cerr << "Failed to parse address book." << endl;
		return -1;
	}

	PrintInfo(person);

	system("pause");
	return 0;
}
主にPaseFroom Istreamを利用して一つのfstreamストリームから序文化された情報を読み取り、逆順序化する。
google protobuf学习笔记二:使用和原理_第1张图片
次のページでは、プロトbuf rpcを利用したデータ転送について説明します。