数据类型
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<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;
}