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 都可以正常编译