如何使用protobuf做C++的序列化方案

Google的protobuf 和最新的flatbuffer 都是做序列化方面的優質框架.跨平臺,容易使用,和強大的數據格式,高效的數據組織支持是我們選擇它的重要原因.本文介紹C++中如何使用.

  1. 版本要求

每個Protobuf的版本針對生成的源代碼文件,和API都是不一致的.所以在操作前請確認對應的版本.目前本文對應使用的是3.6.1版本和3.0 版本.

可以通過使用 protoc.exe --version 指令來看到版本信息.

 

 

目前3.0支持vs2013,15,17

3.6.1版本僅支持vs2015,17

 

  1. 目錄結構

本文同目錄下

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

 

 

  1. 定義結構體

Protobuf的使用流程是如下:

  1. 定義數據結構體,一般是某個.proto文件
  2. 使用自帶的protoc.exe 將上述的.proto文件生成對應語言平臺的 源代碼文件
  3. 在你自己的項目中依賴protobuf中的庫和頭文件後,可直接使用剛纔生成的源代碼文件,進行代碼級別的操作,調用

 

  1. 定義數據結構體

直接新建一個文本文件,內容爲如下內容,保存成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是數據對象主體。其中我們展示了幾種簡單類型,如果要使用複雜類型數據,請參考官方信息。

 

  1. 轉換成C++源代碼

使用本目錄或你獲取的源代碼文件夾下的protoc.exe 文件

 

cd 到proto文件的目錄執行即可 ,其中TestProto3.0.proto 就是你要處理的數據定義文件

 

輸出成C++代碼

protoc  TestProto3.0.proto --cpp_out=.\

 

輸出成C# 代碼

protoc  TestProto3.0.proto --csharp_out=.\

 

更多語言輸出請參考官方文檔。

 

  1. 使用源代碼文件

 

我們創建一個新的工程來演示,在使用源代碼時候的所有依賴。

注意源代碼文件中有TEST_36的宏,(是針對V3.6.1版本,必須要加)

 

  1. 引用頭文件位置,注意google/protobuf字樣不用出現,在頭文件引用中已經使用相對路徑,只要google/protobuf上一級目錄即可

 

  1. LIB 文件的依賴分對應的 VC 版本。如果需要編譯對應VC版本,可以重新編譯Protobuf的源代碼。請參照後續自行編譯部分內容
  2. 在用到的項目或CPP 文件中,直接指定LIB內容,如下圖

 

 

  1. 加入剛纔定義的數據類CPP和頭文件 ,如下圖開始使用

 

  1. 具體代碼中開始使用該數據類

 

 

  1. 將數據類保存到文件

 

  1. 測試,從文件讀取到字符串,然後反序列化到數據類。

 

 

編譯整個程序,運行看到最終結果

 

 

 

  1. 如何編譯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 都可以正常編譯

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章