數據序列化之protobuf


數據序列化之protobuf

很多時候需要將一些數據打包,就是把這些數據搞在一起,方便處理。最常見的情況就是把需要傳輸的數據,當然數據不止一條,打包成一個消息,然后發送出去,接收端再以一定的規則接收並恢復這些數據。這稱為數據序列化以及反序列化。

可能以前最容易想到的簡單方式就是把數據存在一個結構體里面,然后把結構體作為消息發送出去,但是后來呢大家都用的是XML、或者是JSON的數據格式來傳輸,這樣處理數據比較方便。

當然這里介紹的protobuf也是一種數據傳輸格式,它是google的一個開源項目,官方源碼下載(點擊打開鏈接)。不同於XML、JSON等的數據格式,protobuf直接將用戶數據序列化成了二進制數據,這從本質上決定了它的性能優勢,也是目前大家選擇它的一個重要原因,特別是當對傳輸效率要求較高的情況下,protobuf也就成為不二的選擇了。關於它們性能的對比分析詳見這篇文章(點擊打開鏈接)。

 

下面簡單介紹protobuf的用法:

首先protobuf是一套庫,目前支持c++、JavaPython三種語言,這里以c++的用法為例,並且版本使用目前最新的2.6.1。

1、windows平台下

首先,需要編寫.proto文件,這個就相當於是需要傳輸的消息模板,類似於上面的結構體、XML文件等,它定義着需要傳輸的數據本身。下面是一個簡單的例子data.proto。

 

[cpp]  view plain  copy
 
  1. package data;  
  2.   
  3. message user  
  4. {  
  5.     required int32 id = 1;  
  6.     required string name = 2;  
  7. }  

 

 

下一步,由於.proto文件並不能直接傳輸,也不能直接使用,所以還需要將其轉化成其它形式。這一步需要下載protobuf的一個編譯器protoc.exe,可以去官方下載,其作用就是將.proto文件轉換成.pb.h.文件和.pb.h文件,也就是常規的c++頭文件和源文件。接下來看如何使用protoc.exe生成c++文件,假如protoc.exe和data.proto在同一個文件目錄下的話,那么只需要在當前目錄下運行cmd命令:protoc --cpp_out=. ./data.proto,即可當前目錄生成需要的c++文件data.pb.h和data.pb.cc。

 

最后一步,就是如何在具體的項目工程中使用了。先用vs建立一個c++項目,然后將data.pb.h和data.pb.cc導入工程,然后在main函數中引入data.pb.h頭文件,便可以在main函數中使用剛剛定義的消息了,比如下面的簡單使用。

 

[cpp]  view plain  copy
 
  1. int main()  
  2. {  
  3.     // 序列化數據  
  4.     data::user test1;  
  5.     test1.set_id(1);  
  6.     test1.set_name("YJ");  
  7.     std::string str;  
  8.     test1.SerializeToString(&str);  
  9.   
  10.     // 反序列化數據  
  11.     data::user test2;  
  12.     test2.ParseFromString(str);  
  13.     cout << test2.id() << " " << test2.name() << endl;  
  14.     return 0;  
  15. }  

如果就這樣嘗試編譯,那么會報錯,各種頭文件不存在,所以還需添加文件,打開下載好的protobuf源碼,找到/src目錄下的google文件夾,將其拷到工程目錄下,不必導入工程,然后在工程屬性中附加包含目錄中包含google文件夾所在的目錄即可。

繼續嘗試編譯,編譯通過,但是緊接着出現鏈接錯誤,無法解析的外部符號,原因是函數只有聲明沒有實現,所以還需要鏈接protobuf的靜態庫。先打開protobuf的源碼,進入目錄protobuf-2.6.1.zip\protobuf-2.6.1\vsprojects,打開vs工程文件,然后右擊生成解決方案,然后在/debug目錄下找到生成的lib文件,將他們拷入前面的工程目錄下,最后在工程屬性中附加庫目錄即可。

最后一步就是鏈接該庫文件,在man函數前面加上下面兩句代碼。

 

[cpp]  view plain  copy
 
  1. #pragma comment(lib, "libprotobuf.lib")  
  2. #pragma comment(lib, "libprotoc.lib")  


現在編譯運行工程,輸出下面的結果,說明使用protobuf進行數據的序列化和反序列化都可以正常進行。

 

 

2、其他平台的使用

protobuf是可以跨平台的,關鍵問題就是如何生成各個平台下的庫文件,如windows下.lib文件,Android下的.a文件等。

具體的編譯生成方式以后再補充,這里就直接給打包好的,各個平台下的庫文件,以及需要的頭文件(點擊打開鏈接),版本均為2.6.1,參見前面windows下的使用進行包含、引用、鏈接即可。

 

最后附上一篇關於protobuf的不錯的文章(點擊打開鏈接),如果對它還不是很明白,可以去看看。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM