zl程序教程

您现在的位置是:首页 >  工具

当前栏目

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 数据交换的功能。

  1. 序列化: 将 数据结构或对象 转换成 二进制串 的过程
  2. 反序列化:将在序列化过程中所生成的二进制串 转换成 数据结构或者对象 的过程

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"