最近自己的服務器做到序列化這一步了,在網上看了下,序列化的工具有boost 和google的protocol buffer,
protocol buffer的效率和使用程度更高效一些,就自己琢磨下把他加到自己的服務器里。
所以這里我先弄一個小的demo去測試如何使用和配置protocol buffer
首先是windows 平台
windows下protocol buffer 配置:
1 下載protocol buffer, 去google官網或者其他渠道下載protocol buffer包
2 解壓zip文件,進入vs文件夾編譯protocol buffer,圖示如下
3 工程下的幾個項目都編譯一遍,會生成幾個lib
在vs目錄下的debug目錄里能看到
protoc.exe 和 libprotobuf.lib, libprotobuf-lite.lib , libprotoc.lib這幾個lib是新生成的,先放一放,以后會用到。
到此為止,google protocol buffer的配置和庫已經生成,我們下一步設計自己的proto文件,並生成對應的pb.h和pb.cc
4編寫自己的proto 格式如下
package smart; message test { required string name = 1; required int32 age = 2; optional string email = 3; }
package 表示聲明為包名,package smart;表示包名為smart
message test定義一個消息體,花括號結束不需要分號
括號內是成員變量,成員變量后面的數字默認從1開始,依次遞增。 required表示這個字段必須有,
optional表示字段可選,還有一些repeated表示可重復的值域,常用於數組。
總結下:
數據結構體:
message message_name{message_body;}
message_body格式:
例如
required int32 query = 1[defaut=10];
形式為:rule type name = value[other_rule]; 規則:
required表示必須具有該值域;
optional表示可選的值域;
repeated表示可重復的值域(即>=0);
其中requered/optional是常用rule,而repeated則不常用同時因為是歷史遺留現使用repeated int32 samples=4[packed=true];形式;
value值:
value值最小為1,是底層編碼時使用其中1-15占一位,>15則會占多位;
不同的message中的value值互不干擾,常以1開始計數。
5保存為包名.消息名.proto的形式,我保存為smart.msg.proto
6接下來進行編譯這個smart.msg.proto, protobuf提供了protoc命令
protoc --proto_path=(.proto文件路徑) --cpp_out=(.cc .java生成文件路徑) (.proto文件路徑)/?.proto
--proto_path 簡化為: -I
其中可根據需要更改:cpp_out選項為java_out/python_out。
舉例: protoc -I=./ --cpp_out=./ ./smart.msg.proto
windows環境下打開cmd,進入到protocol buf vs目錄里debug文件夾里調用protoc命令
我的proto放在D:\win32projects\protobuftest\ProtoBuf目錄,所以如下:
進入D:\win32projects\protobuftest\ProtoBuf下可看到新生成的文件
到目前為止,准備工作都做完了,下一步建立自己的項目,使用這些.h和.cc
7建立vs項目,我命名為protobuftest,在項目目錄里建立Include和Lib,Protobuf
文件夾,將protobuff庫的src文件夾拷貝到Include里,將libprotobuf.lib,
libprotobuf-lite.lib , libprotoc.lib拷貝到Lib文件里,將smart.msg.proto拷貝到Protobuf中,
將protobuff庫的那個debug也拷貝到Protobuf中,因為我想通過寫一個批處理文件在該項目
里生成.h和.cc文件。
Lib文件夾:
Include文件夾:
Protobuf文件夾:
bat如下:
cd .\Debug protoc -I=..\ --cpp_out=..\ ..\smart.msg.proto pause
8 將ProtoBuf文件夾里的.h和.cc添加到項目里
配置項目屬性C/C++ ----> General ---> Additional Include Directories ..\Include\src
Linker--->General ----> Additional Library Directories ..\Lib
順便把預編譯也關了
9項目配置好后寫代碼:
#include "stdafx.h" #include <iostream> #include <fstream> #include "../ProtoBuf/smart.msg.pb.h" #pragma comment(lib, "libprotobuf.lib") #pragma comment(lib, "libprotoc.lib") int _tmain(int argc, _TCHAR* argv[]) { smart::test msg1; msg1.set_age(101); msg1.set_name("nice to meet you!"); std::fstream out("User.pb", std::ios::out | std::ios::binary | std::ios::trunc); msg1.SerializeToOstream(&out); out.close(); smart::test msg2; std::fstream in("User.pb", std::ios::in | std::ios::binary); if (!msg2.ParseFromIstream(&in)) { std::cerr << "Failed to parse User.pb." << std::endl; exit(1); } std::cout << msg2.age() << std::endl; std::cout << msg2.name() << std::endl; std::cout << msg2.email() << std::endl; std::cout << "adfdf" <<std::endl; getchar(); return 0; }
測試輸出
到此為止windows環境配置和使用google protocol buffer已經解決。下面是Linux環境配置和使用:
1解壓編譯配置,敲命令就可以了:
unzip protobuf-2.6.1
cd protobuf-2.6.1 ./configure --prefix=/usr/local/protobuf-2.6.1 make make check make install
2寫proto文件和編譯,跟上面的相同:
3 連帶.cc文件一同編譯,生成目標並執行,以后會寫成makefile,這只是個測試程序,就簡單測試下
記得編譯時帶上-lpthread 和-lprotobuf
如果運行時提示找不到libprotobuf9.so這個庫,可以敲這個命令
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
到此為止就完成了google protobuf的 學習和配置,謝謝關注我的微信公眾號: