protobuf序列化

  • linux 编译gcc版本要高至少在4.8以上,编译时加库 -lprotobuf -lpthread
#include <google/protobuf/message.h>
// 所有protobuf内容都包含在这个里面
google::protobuf::Message * pMsg = NULL;
  • 准备数据
    • 符合类型: 结构体/类
    • 基础类型
  • 创建一个新文件 xxx.proto
  • 将我们要序列化的数据 -> 写入到proto文件
    • 有语法格式
  • 通过一个命令 protocxxx.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;
}

posted on 2021-05-26 18:40  lodger47  阅读(355)  评论(0)    收藏  举报

导航