protobuf
1:protobuf是一个跨语言,跨平台, 可扩展的序列化/反序列化数据结构的工具;
2: protobuf的使用基本步骤:
a:将要传递的数据结构做成 protobuf协议描述文件: .proto文件;
b:protobuf工具protoc将协议描述文件转成对应语言的代码(js, c++, c#, python等);
c: 使用代码来构造数据对象;
d: 使用数据对象的接口来初始化数据对象;
e: 利用自动生成的代码,将这个数据二进制序列化;
f: 传输二进制序列;
g: 在使用自动生成的代码反序列化(解码),生成数据对象使用;
3: protobuf优点:
json, xml 占用的空间比较大;
protobuf 占用的空间小,效率高;
protobuf也常用于应用层协议的编码和解码;
环境搭建
1: 下载protobuf源码: https://github.com/google/protobuf
2: 下载项目构建工具cmake: https://cmake.org/download/
完成cmake构建之后需要生成三个解决方案:libprotobuf、libprotoc、protoc,生成之后将Debug文件夹中的libprotobufd.lib、libprotocd.lib拉到项目中,在解决方案的属性中把这两个库给链接上。
3: 编写.proto协议文件,使用proto2或proto3
4: 使用protoc.exe和命令行生成对应语言的protobuf脚本,例如c++:
protoc.exe --cpp_out=./ person.proto
5: 把生成的代码文件拖到工程中,include .h文件
6: 把github下载的protobuf文件全部拖入项目中,在解决方案的C/C+±>常规->附加包含目录中设置对应的库文件根路径。例如C++对应protobuf的src文件夹。
7: 可以开始编写代码了
代码
#include <string.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <string>
using namespace std;
#include "../proto/person.pb.h"
#if 0
int main(int argc, char** argv) {
// 定义一个你要传送数据的对象;
// 初始化好了这个对象的数据成员;
Person p;
p.set_name("xiaoming");
p.set_email("xiaoming@bycwedu.com");
p.set_age(34);
printf("%s %s %d\n", p.name().c_str(), p.email().c_str(), p.age());
// 将这个数据对象序列化;
string out;
p.SerializeToString(&out