pb序列化学习
学习 序列化 PB
2023-09-14 09:11:20 时间
转自:http://xcd.blog.techweb.com.cn/archives/173.html,https://blog.csdn.net/carson_ho/article/details/70568606
1.例子
int main(int argc, char* argv[]) { using namespace x; Person p; p.set_name("tom"); p.set_id(88); p.set_email("123@gmail.com"); std::string str; p.SerializeToString(&str); // 将对象序列化到字符串,除此外还可以序列化到fstream等 printf("%s\n", str.c_str()); std::cout<<"——----————\n"<<str<<endl; Person x; x.ParseFromString(str); // 从字符串反序列化 printf("x.name = %s\n", x.name().c_str()); // 这里的输出将是tom,说明反序列化正确 //server stop & exit return 0; } // 123@gmail.com // ——----———— // 123@gmail.com // x.name = tom
上面直接打印序列化之后的str,发现并不是按照json这种格式来序列化的。
x.proto文件 。
syntax="proto3"; package x; message Person { string name = 1; int32 id = 2; string email = 3; }
2.序列化
序列化 = 对数据进行编码 + 存储
通过将 结构化的数据 进行 串行化(序列化),从而实现 数据存储 / RPC 数据交换的功能。
- 序列化: 将 数据结构或对象 转换成 二进制串 的过程
- 反序列化:将在序列化过程中所生成的二进制串 转换成 数据结构或者对象 的过程
Protocol Buffer
将 消息里的每个字段 进行编码后,再利用T - L - V
存储方式 进行数据的存储,最终得到的是一个 二进制字节流。
那么上面例子中使用string类型来存储序列化之后的二进制字节流是否合适?
https://blog.csdn.net/u012101384/article/details/121744235,https://cplusplus.com/reference/string/string/
string类的定义:Strings are objects that represent sequences of characters.
string来存储二进制数据可能会因为有\0而认为是结尾的问题,其他似乎就没什么问题了。在数据传输中,二进制数据的buffer一般用系统预设的大数组进行存储。
C++ 中的string通常情况是用来保存字符串的,遇到标识符’\0’便停止继续操作。但是在默认构造里面提供了其他的参数,可用于保存字节流,’\0’不影响字节流的保存和使用。
char sz[] = {'h', 'e', 'l', 'l', 'o', '\0', 'w', 'o', 'r', 'l', 'd', '\0'}; //string s1(sz); // s1="hello" string s1(sz, sizeof(sz)); // s1="hello\x00world\x00"
相关文章
- 从CTF中学习PHP反序列化的各种利用方式
- PHP反序列化进阶学习与总结
- yaml语言学习笔记
- Flask 学习-38.Flask-RESTful 序列化输出中文显示问题
- 02:机器学习实战:最小二乘法
- 从零开始学习UCOSII操作系统2–UCOSII的内核实现「建议收藏」
- 【Python】MongoDB数据库安装和Pymongo操作学习
- MyBatis学习笔记(一)入门详解编程语言
- 从Linux内核中学习函数命名之道(linux函数命名)
- 如何学习嵌入式Linux?(怎么学习嵌入式linux)
- 记录MongoDB学习之路(mongodb笔记)
- 学习Linux: 从Man手册开始(linuxman意思)
- 学习如何管理SQLServer实例的运行与维护(实例 sqlserver)
- 学习Linux网络:网络视频教程指导(linux网络视频教程)
- CNN 在基于弱监督学习的图像分割中的应用
- JavaScript学习笔记(九)call和apply方法