很久之前就聽過protobuf,但是一直沒有使用過,最近在做一個小東西,涉及到C++和go的數據交換,就想到了使用protobuf,由於沒有使用過,所以就先需要一些小小的試驗,接下來就有了本文。
一、protobuf簡介
protobuf全稱爲google protocol buffer,是google內部使用的一種數據交換格式,後來開源出來了。protobuf是一種語言無關、平臺無關、擴展性好的用於通信協議、數據存儲的結構化數據串行化方法。很像XML、JSON等,不過它更小、更快、也更簡單。你可以定義自己的數據結構,然後使用代碼生成器生成的代碼來讀寫這個數據結構。
二、下載安裝protobuf
要想使用protobuf,得先進行安裝,在http://code.google.com/p/protobuf/downloads/list下載protobuf源碼包protobuf-2.5.0.tar.gz,在終端下依次執行如下命令進行protobuf的安裝:
tar -zxvf protocol-2.5.0.tar.gz
cd protobuf-2.5.0
./configure
make
make check
sudo make install
安裝完成後在終端下執行vim ~/.profile
打開配置文件,在該文件中添加export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
,然後保存退出,接下來執行source ~/.profile
是配置文件修改生效,最後執行protoc --version
查看protobuf版本以測試是否安裝成功
三、生成protobuf協議文件
執行命令vim msg.proto
新建一個名爲msg.proto的文件,並將其打開,在msg.proto中輸入如下內容:
package demo;
message msg
{
required int32 MsgType = 1; //必選字段
required string MsgInfo = 2; //必選字段
required string MsgFrom = 3; //必選字段
optional string opt = 4; //可選字段
}
輸入完成後,保存退出,在終端下執行protoc --cpp_out=. msg.proto
生成對應的msg.pb.h和msg.pb.cpp文件
四、在C++中使用protobuf
執行命令vim protobuf_test.cc
新建一個名爲protobuf_test.cc的C++源文件,並將其打開,在其中輸入如下內容:
#include "msg.pb.h"
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[]){
demo::msg msg_test;
msg_test.set_msgtype(1);
msg_test.set_msginfo("I am hahaya");
msg_test.set_msgfrom("127.0.0.1");
//將信息格式化到字符串中(寫操作)
string in_data;
msg_test.SerializeToString(&in_data);
cout << "format:" << in_data << endl;
//將信息從字符串中反格式化出來(讀操作)
demo::msg msg_encoding;
msg_encoding.ParseFromString(in_data);
cout << "msg type:" << msg_encoding.msgtype() << endl;
cout << "msg info:" << msg_encoding.msginfo() << endl;
cout << "msg from:" << msg_encoding.msgfrom() << endl;
return 0;
}
輸入完成後,保存退出,在終端下執行g++ protobuff_test.cc msg.pb.cc -o main -lprotobuf
-pthread命令進行編譯,編譯成功後執行./main
運行。
數據交換使用protobuf真方便,google的東西真心靠譜,更多關於protobuf的使用請在官網http://code.google.com/p/protobuf/上查看~