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_8int32 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;
}
Protobuf序列化相关推荐
- 【Android Protobuf 序列化】Protobuf 服务器与客户端通信 ( TCP 通信中使用 Protobuf )
文章目录 一.TCP 粘包和分包 二.TCP 粘包和分包解决方案 三.客户端 Android 应用使用 Protobuf 四.服务器端 Java 服务器使用 Protobuf 五.参考资料 一.TCP ...
- 【Android Protobuf 序列化】Protobuf 性能测试 ( fastjson 序列化与反序列化 | gson 序列化与反序列化 | 三种序列化与反序列化性能对比 )
文章目录 一.导入依赖库 二.构造 JavaBean 三.fastjson 序列化与反序列化 四.gson 序列化与反序列化 五.完整代码 1.主界面代码 2.JSON 测试代码 3.执行结果 六.参 ...
- 【Android Protobuf 序列化】Protobuf 使用 ( Protobuf 序列化 | Protobuf 反序列化 )
文章目录 一.Protobuf 序列化 二.Protobuf 反序列化 三.完整代码 四.参考资料 一.Protobuf 序列化 在上一篇博客 [Android Protobuf 序列化]Protob ...
- 【Android Protobuf 序列化】Protobuf 使用 ( Protobuf 源码分析 | 创建 Protobuf 对象 )
文章目录 一.Protobuf 源码分析 二.创建 Protobuf 对象 三.完整代码示例 四.参考资料 一.Protobuf 源码分析 Protobuf 源文件如下 : addressbook.p ...
- 【Android Protobuf 序列化】Protobuf 使用 ( protobuf-gradle-plugin 插件简介 | Android Studio 中配置插件 | AS 中编译源文件 )
文章目录 一.protobuf-gradle-plugin 插件简介 二.Android Studio 中配置 protobuf-gradle-plugin 插件 三.Android Studio 中 ...
- 【Android Protobuf 序列化】Protobuf 使用 ( protoc 编译器简介 | 下载 protoc 编译器 | 使用 protoc 编译器编译 .proto 源文件 )
文章目录 一.protoc 编译器简介 二.下载 protoc 编译器 三.使用 protoc 编译器编译 addressbook.proto 源文件 四.参考资料 一.protoc 编译器简介 在上 ...
- 【Android Protobuf 序列化】Protobuf 简介 ( Protobuf 项目简介 | Protobuf 优缺点分析 )
文章目录 一.Protobuf 简介 二.Protobuf 优缺点分析 1.Protobuf 优点 2.Protobuf 缺点 三.参考资料 一.Protobuf 简介 Protobuf 是 Goog ...
- net自带二进制序列化,XML序列化和ProtoBuf序列化的压缩对比
测试结果: ProtoBuf Length:115 BinaryFormatter Length:1177 XmlSerializer Length:814 xml length:825 做了一个各种 ...
- Protobuf序列化原理
一.Protobuf序列化原理简介 1.1序列化 序列化是将数据结构或对象转换成二进制字节流的过程. Protobuf对于不同的字段类型采用不同的编码方式和数据存储方式对消息字段进行序列化,以确保得到 ...
- Protobuf序列化的原理
我们可以把序列化以后的数据打印出来看看结果 public static void main(String[] args) { UserProtos.User user = UserProtos.Use ...
最新文章
- java数据类型指定长度_判断(2分) Java的各种数据类型占用固定长度,与具体的软硬件平台环境无关...
- bzoj1601【Usaco2008 Oct】灌水
- Annotation 的第一个工程
- 中国金融出版社出版的2016版《个人贷款》
- python教程循环语句,Python基础教程之循环语句(for、while和嵌套循环)
- 临床外显子组测序分析中的那些坑(中)
- 【PyTorch】eval() ==>主要是针对某些在train和predict两个阶段会有不同参数的层,比如Dropout层和BN层
- CCF 201503-1 图像旋转
- WPF:Documents文档--Annomation批注(1)
- 拷贝data/data/包名/files文件记下所有文件及文件夹到本地sdcard根目录teddyData_files文件夹下...
- Docker 容器使用教程
- PLC数据采集之协议转换桥接器
- C标准库stdio源码分析
- 项目管理java_java项目管理经验总结
- HashMap、ConcurrentHashMap(1.7、1.8)源码分析 + 红黑树
- iOS 打点上报、无痕埋点
- 将阿拉伯数字转换成汉字数字(小写)
- Java 如何控制项目进度?
- 阿里智能运维实践|阿里巴巴DevOps实践指南
- R语言survival包clogit函数构建条件logistic回归模型、summary函数查看模型汇总统计信息、通过似然比检验分析结果判断模型有无统计学意义