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

  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"

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,所以就是结束符?

 

posted @ 2022-12-13 10:15  lypbendlf  阅读(277)  评论(0编辑  收藏  举报