Protobuf序列化

数据类型

proto类型C++类型备注
doubledouble64位浮点数
floatfloat32位浮点数
int32int3232位整数
int64int6464位整数
uint32uint3232位无符号整数
uint64uint6464位无符号整数
sint32sint3232位整数,处理负数效率比int32更高
sint64sint6464位整数,处理负数效率比int64更高
fixed32uint32总是4个字节。如果数值总是比总是比228大的话,这个类型会比uint32高效。
fixed64uint64总是8个字节。如果数值总是比总是比256大的话,这个类型会比uint64高效。
sfixed32int32总是4个字节
sfixed64int64总是8个字节
boolbool布尔类型
stringstring一个字符串必须是UTF-8编码或者7-bit ASCII编码的文本
bytesstring处理多字节的语言字符、如中文
enumenum枚举
messageobject of class自定义的消息类型

编写proto文件生成类

syntax= "proto3";


//	bytes和string 的区别 
//	string 如果使中文的话需要转换成utf_8,不然会报错
//	bytes 支持多字节

message Person
{
	int32 id = 1;
    bytes name = 2;		
    string sex = 3;		// 如果使中文的话需要转换成utf_8
    int32 age = 4;

}

使用proto命令生成类

proto ./Person.proto --cpp_out=.

代码参考

#include<iostream>
#include <string>
#include "Person.pb.h"

using namespace std;


void Serialization(string &data)
{
	Person person;
	person.set_id(10086);
	person.set_name("李白");
	person.set_sex("man");
	person.set_age(18);

	//序列化数据
	person.SerializePartialToString(&data);

}

void Deserialization(string data)
{
	Person person2;
	//反序列化(解码)
	person2.ParseFromString(data);

	cout << "Id:" << person2.id() << " 姓名:" << person2.name() <<
		" 性别:" << person2.sex() << "	年龄:"<< person2.age() << endl;
}

int main()
{

	//调用序列化(编码)
	string data;
	Serialization(data);

	//反序列化(解码)
	Deserialization(data);


	system("pause");
	return 0;
}

Protobuf中的数组

repeated限定修饰符

proto示例:

message Person
{
	int32 id = 1;
	repeated bytes name = 2;  // Protobuf数组。		
	string sex = 3;		
	int32 age = 4;
}

代码示例

#include<iostream>
#include <string>
#include "Person.pb.h"

using namespace std;


void Serialization(string &data)
{

	//数组使用
	Person person;

	person.set_id(10086);	

	person.add_name(); //申请空间
	person.set_name(0, "李白");
	person.add_name(); //申请空间
	person.set_name(1, "杜甫");
	person.add_name(); //申请空间
	person.set_name(2, "王维");

	person.set_sex("man");
	person.set_age(18);
	person.SerializePartialToString(&data);


}

void Deserialization(string data)
{
	Person person2;
	//反序列化(解码)
	person2.ParseFromString(data);

	for (int i = 0; i < person2.name_size(); i++)
	{
		cout << "Id:" << person2.id() << " 姓名:" << person2.name(i) <<
			" 性别:" << person2.sex() << "	年龄:" << person2.age()<<endl;

	}
}

int main()
{

	//调用序列化(编码)
	string data;
	Serialization(data);

	//反序列化(解码)
	Deserialization(data);


	system("pause");
	return 0;
}

Protobuf中的枚举

proto文件

syntax= "proto3";


//	bytes和string 的区别 
//	string 如果使中文的话需要转换成utf_8,不然会报错
//	bytes 支持多字节



// protobuf中枚举值,必须从0开始。
// 不允许枚举常量无值。
enum Color 
{
	Red = 0;	
	Green = 1;
	Blue = 2;
	Pink = 3;		
}


message Person
{
	int32 id = 1;
	repeated bytes name = 2;		
    string sex = 3;		// 只支持 英文。
    int32 age = 4;
	Color color = 5;
}

代码示例

#include<iostream>
#include <string>
#include "Person.pb.h"

using namespace std;


void Serialization(string &data)
{

	//数组使用
	Person person;

	person.set_id(10086);	

	person.add_name(); //申请空间
	person.set_name(0, "李白");
	person.add_name(); //申请空间
	person.set_name(1, "杜甫");
	person.add_name(); //申请空间
	person.set_name(2, "王维");

	person.set_sex("man");
	person.set_age(18);

	person.set_color(Pink);

	person.SerializePartialToString(&data);

}

void Deserialization(string data)
{
	Person person2;
	//反序列化(解码)
	person2.ParseFromString(data);

	for (int i = 0; i < person2.name_size(); i++)
	{
		cout << "Id:" << person2.id() << " 姓名:" << person2.name(i) <<
			" 性别:" << person2.sex() << "	年龄:" << person2.age()<<"颜色: "<<person2.color()<<endl;

	}
}

int main()
{

	//调用序列化(编码)
	string data;
	Serialization(data);

	//反序列化(解码)
	Deserialization(data);


	system("pause");
	return 0;
}

在proto文件中导入其他proto文件

示例

void Serialization(string &data)
{

	//数组使用
	Person person;

	person.set_id(10086);	

	person.add_name(); //申请空间
	person.set_name(0, "李白");

	person.set_sex("man");
	person.set_age(18);
	person.set_color(Pink);
	//info是Person 的成员
	Info* info = person.mutable_info();
	info->set_address("大唐");
	info->set_num(10086);
	
	//序列化数据
	person.SerializePartialToString(&data);
}

protobuf中的命名空间(包)

示例

syntax = "proto3";		

import "Info.proto";

// 指定包名,区别当前的Person 和其他包中的 Person
//当前文件的包名
package wuyouProto;			

message Person
{
	int32 id = 1;
	repeated bytes name = 2;	// 代表数组,可以存多个数据
	string sex = 3;
	int32 age = 4;
	
	//包名.类名
	TestName.Person info = 6;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值