pb序列化学习[已迁移]
转自: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"
3.C++如何存储字符串与字节串
在C++中,string既可以存储ASCII文本字符串,也能存储任意多个\0的二进制序列。 string是C++标准定义的字符串类,它不但支持文本,而且支持二进制字节流。
https://blog.csdn.net/changqing5818/article/details/51014696,博客中举了例子。
但C++中一般使用char数组来保存二进制数据。
const int max_length = 1024 * 1024; unsigned char data[max_length];
因为二进制数据中可能会包含\x00(即:’\0’),刚好是字符串结束标志。//为什么?不理解
//因为\x00是16进制表示法,实际上用二进制就是\0,所以就是结束符?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2018-12-13 FPKM\RPKM\TPM学习[转载]