Google的protobuf 和最新的flatbuffer 都是做序列化方面的優質框架.跨平臺,容易使用,和強大的數據格式,高效的數據組織支持是我們選擇它的重要原因.本文介紹C++中如何使用.
每個Protobuf的版本針對生成的源代碼文件,和API都是不一致的.所以在操作前請確認對應的版本.目前本文對應使用的是3.6.1版本和3.0 版本.
可以通過使用 protoc.exe --version 指令來看到版本信息.
目前3.0支持vs2013,15,17
3.6.1版本僅支持vs2015,17
本文同目錄下
protoc3.0.exe 是3.0版本用於生成數據結構的程序
protoc3.6.1.exe 是3.6.1版本用於生成數據結構的程序
TestProto3.0.proto 是3.0版本定義Proto數據文件的示例文件
TestProto3.6.1.proto 是3.6.1版本定義Proto數據文件的示例文件
howtouse目錄下的touseprotobuf 目錄中爲測試項目
howtouse目錄下的references目錄下爲依賴的頭文件和LIB 文件(分3.0,3.6.1)
protobuf-master361 目錄爲protobuf 3.6.1版本源代碼.可以通過CMAKE自行編譯你自己需要的版本。
protobuf-3.0.0 目錄爲3.0版本僅C++的源代碼
更多版本內容和獨立語言的源代碼可以在這裏下載
https://github.com/protocolbuffers/protobuf/releases
Protobuf的使用流程是如下:
- 定義數據結構體,一般是某個.proto文件
- 使用自帶的protoc.exe 將上述的.proto文件生成對應語言平臺的 源代碼文件
- 在你自己的項目中依賴protobuf中的庫和頭文件後,可直接使用剛纔生成的源代碼文件,進行代碼級別的操作,調用
直接新建一個文本文件,內容爲如下內容,保存成ObjectBaseConfig.proto文件即可。(文件名可隨意自行制定)
syntax = "proto3";
package UNISOL_REPO;
message ObjectConfig
{
//基本信息
string ModelName = 1;
int32 uid=2;
string DisplayName = 3;
string NodePath=4;
float Width = 5;
float Length=7;
//攻擊範圍
float airAttackRange=8;
float tonnage=11;
//各種攻擊彈藥數量
int32 airMissleCount=12;
}
syntax代表當前protobuf版本 , 不同版本間區別不小,要重視
package是指生成的源代碼的namespace
message是數據對象主體。其中我們展示了幾種簡單類型,如果要使用複雜類型數據,請參考官方信息。
- 轉換成C++源代碼
使用本目錄或你獲取的源代碼文件夾下的protoc.exe 文件
cd 到proto文件的目錄執行即可 ,其中TestProto3.0.proto 就是你要處理的數據定義文件
輸出成C++代碼
protoc TestProto3.0.proto --cpp_out=.\
輸出成C# 代碼
protoc TestProto3.0.proto --csharp_out=.\
更多語言輸出請參考官方文檔。
我們創建一個新的工程來演示,在使用源代碼時候的所有依賴。
注意源代碼文件中有TEST_36的宏,(是針對V3.6.1版本,必須要加)
- 引用頭文件位置,注意google/protobuf字樣不用出現,在頭文件引用中已經使用相對路徑,只要google/protobuf上一級目錄即可
- LIB 文件的依賴分對應的 VC 版本。如果需要編譯對應VC版本,可以重新編譯Protobuf的源代碼。請參照後續自行編譯部分內容
- 在用到的項目或CPP 文件中,直接指定LIB內容,如下圖
- 加入剛纔定義的數據類CPP和頭文件 ,如下圖開始使用
- 具體代碼中開始使用該數據類
- 將數據類保存到文件
- 測試,從文件讀取到字符串,然後反序列化到數據類。
編譯整個程序,運行看到最終結果
- 如何編譯protobuf源代碼
基本上如果是使用protobuf直接使用即可。
不需要重新編譯。所以這章不需要看。
從github中下載。到本地後,使用cmake GUI工具生成針對VC的工程項目。
cmake定位在protobuf-master\cmake 目錄中。
生成後的SLN項目在CMake指定的輸出目錄下。類似如下圖
打開 VS 後,新增X64平臺編譯,確認都可行。
要注意的是: 部分項目不需要可以刪除。
protoc項目編譯時候出現x86和x64的錯誤,請排查如下3個地方:
和
我當前只需要編譯這4個即可。 直接全部一起編譯可能會有一些奇怪的錯誤,但是每個單獨編譯都沒有問題。
要注意:默認項目生成類型爲MT,MTd, 請修改成MD ,MDd.
目前已確認Vs2015,Vs2017 都可以正常編譯