• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2022-01-24 15:05 Aet 隐藏边栏 |   抢沙发  8 
文章评分 2 次,平均分 5.0

理解

  1. protobuf允许不同编程语言的程序员 以自己熟悉的方式在.proto文件里定义消息结构
  2. 然后protobuf的引擎把这个.proto文件里描述的消息结构进行解析,最后生成对应语言的代码,这些代码里描述了之前定义的消息结构
  3. 然后在项目中,需要用到这些消息结构的模块,只需引入这些代码,就可以使用生成的代码中提供的一些接口来序列化或反序列化

差异

序列化方法

  1. 原始内存数据结构以二进制形式发送或保存。
    1. 缺陷是必须使用完全相同的内存布局、字节序等来编译接收/读取代码
  2. 发明一种特殊方式将数据项编码为单个字符串。
    1. 适合编码非常简单的数据
  3. 将数据序列化为 XML
    1. 问题是XML 是空间密集型的,编码/解码它会给应用程序带来巨大的性能损失
    2. 导航 XML DOM 树比导航类中的简单字段通常要复杂得多

protobuf

  1. 解决上面的问题。
  2. 编写.proto要存储的数据结构的描述
  3. 协议缓冲区编译器创建了一个类:
    1. 该类以高效的二进制格式实现协议缓冲区数据的自动编码和解析
    2. 生成的类为构成协议缓冲区的字段提供了 gettersetter
    3. 并将读写协议缓冲区的细节作为一个单元处理
    4. 重要的是,协议缓冲区格式支持随着时间的推移扩展格式的想法,这样代码仍然可以读取使用旧格式编码的数据

基础

类型

  1. bool
  2. int32
  3. float
  4. double
  5. string
  6. 其他message类型

语法

  1. 还可以定义enum类型,让某些字段具有预定义的值(如上述PhoneType
  2. 每个元素后面的= 1,= 2标记,标识该字段在二进制编码中使用的唯一“标签”。
    1. 标签编号 1-15 比更高的编号需要少一个字节来编码
    2. 因此作为一种优化,您可以决定将这些标签用于常用或重复的元素,而将标签 16 和更高的标签用于不太常用的可选元素
  3. optional
    1. 该字段可以设置也可以不设置
    2. 如果未设置可选字段值,则使用默认值
      对于简单类型,您可以指定自己的默认值,就像上面的type那样
      否则,使用系统默认值:数字类型为零,字符串为空字符串,布尔值为 false
      对于message,默认值始终是消息的“默认实例”或“原型”,没有设置任何字段
      调用访问器以获取未显式设置的可选(或必需)字段的值始终返回该字段的默认值
  4. repeated
    1. 该字段可以重复任意次数(包括零次)
    2. 可以将重复字段视为动态大小的数组
  5. required
    1. 必须提供该字段的值,否则该消息将被视为“未初始化”
    2. 如果libprotobuf在调试模式下编译,序列化未初始化的message将导致断言失败
      在优化的构建中,会跳过检查并且无论如何都会写入消息
      但是,解析未初始化的消息总是会失败(从Parse

编译

  1. 下载生成工具:地址
  2. Windows下下载Win32压缩包
  3. proto文件定义

  1. 命令如下图:

API

解析和序列化

  1. 每个协议缓冲区类都有使用协议缓冲区二进制格式写入和读取您选择的类型的消息的方法
  2. bool SerializeToString(string* output) const;
    1. 序列化消息并将字节存储在给定的字符串中
    2. 需要注意的是,字节是二进制的,而不是文本;使用string类只是作为一个方便的容器
  3. bool ParseFromString(const string& data);
    1. 从给定的字符串解析消息
  4. bool SerializeToOstream(ostream* output) const;
    1. 将消息写入给定的 C++ ostream
  5. bool ParseFromIstream(istream* input);
    1. 解析来自给定 C++ 的消息istream

使用

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2024-07-03
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享