如何使用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 都可以正常编译

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