protobuf序列化
- linux 编译gcc版本要高至少在4.8以上,编译时加库 -lprotobuf -lpthread
#include <google/protobuf/message.h>
// 所有protobuf内容都包含在这个里面
google::protobuf::Message * pMsg = NULL;
- 准备数据
- 符合类型: 结构体/类
- 基础类型
- 创建一个新文件 xxx.proto
- 将我们要序列化的数据 -> 写入到proto文件
- 有语法格式
- 通过一个命令
protoc将xxx.proto文件生成一个c++类- 对应一个头文件/源文件
- 直接使用这个类
- 里面有对数据的操作api
- 读数据的api
- 写数据的api
protoc xxx.proto --cpp_out=./ 就会生成.cc 和 .h两个文件
// protobuf的版本
syntax = "proto3";
// 语法格式
message 关键字(相当于被创建出来的类的名字)
{
// 成员变量
数据类型 变量名 = 变量的编号; // 编号从1开始,不能重复
}

示例info.proto
syntax = "proto3";
package itheima;
message Info
{
bytes address = 1; // 地址
int32 number = 2; // 门牌号
}
示例Persion.proto
syntax = "proto3";
// 导入另外要给proto文件
import "info.proto";
// 添加命名空间
package itcast; // Person中
enum Color
{
Read = 0; //protobuf中第一个枚举值必须是0
Green = 6;
Blue = 9;
}
message Persion {
int32 id = 1;
int32 age = 2;
repeated bytes name = 3; // name可以在程序中创建多个,在程序中作为动态数组来使用
bytes sex = 4;
Color color = 5;
// 命名空间.类名
itheima.Info info = 6;
}
c++代码示例
#include "Persion.pb.h"
using namespace std;
using namespace itcast;
using namespace itheima;
int main()
{
Persion p;
p.set_age(12);
p.set_id(11);
p.set_sex("man");
// 申请-快内存,存储名字
p.add_name();
p.set_name(0, "小明");
p.add_name();
p.set_name(1, "艾斯");
// 枚举
p.set_color(Blue);
// 嵌套类
Info* info = p.mutable_info();
info->set_address("西安市");
info->set_number(18);
string name;
p.SerializeToString(&name);
cout << " name = " << name << endl;
Persion pp;
pp.ParseFromString(name);
Info ii = pp.info();
cout << "id = " << pp.id() << " name = " << pp.name(0)
<< " name = " << pp.name(1) << " sex = " << pp.sex()
<< " age = " << pp.age()
<< " color = " << pp.color()
<< " info.address = "<< ii.address()
<< " info.number = "<<ii.number()
<< endl;
return 0;
}
浙公网安备 33010602011771号