Protobuf序列化

文章目录

      • 数据类型
      • 编写proto文件生成类
      • Protobuf中的数组
      • Protobuf中的枚举
      • 在proto文件中导入其他proto文件
      • protobuf中的命名空间(包)

数据类型

proto类型 C++类型 备注
double double 64位浮点数
float float 32位浮点数
int32 int32 32位整数
int64 int64 64位整数
uint32 uint32 32位无符号整数
uint64 uint64 64位无符号整数
sint32 sint32 32位整数,处理负数效率比int32更高
sint64 sint64 64位整数,处理负数效率比int64更高
fixed32 uint32 总是4个字节。如果数值总是比总是比228大的话,这个类型会比uint32高效。
fixed64 uint64 总是8个字节。如果数值总是比总是比256大的话,这个类型会比uint64高效。
sfixed32 int32 总是4个字节
sfixed64 int64 总是8个字节
bool bool 布尔类型
string string 一个字符串必须是UTF-8编码或者7-bit ASCII编码的文本
bytes string 处理多字节的语言字符、如中文
enum enum 枚举
message object 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
#include 
#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
#include 
#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
#include 
#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;
}

你可能感兴趣的:(C++,序列化,Protobuf)