Protobuf 的 proto3 与 proto2 的区别

转载自:https://solicomo.com/network-dev/protobuf-proto3-vs-proto2.html

这是一篇学习笔记。在粗略的看了 Protobuf 的文档中关于 proto2 和 proto3 的说明后,记录下了几点 proto3 区别于 proto2 的地方。

总的来说,proto3 比 proto2 支持更多语言但 更简洁。去掉了一些复杂的语法和特性,更强调约定而弱化语法。如果是首次使用 Protobuf ,建议使用 proto3 。

  1. 在第一行非空白非注释行,必须写:

    syntax = "proto3";

  2. 字段规则移除了 “required”,并把 “optional” 改名为 “singular”;

    在 proto2 中 required 也是不推荐使用的。proto3 直接从语法层面上移除了 required 规则。其实可以做的更彻底,把所有字段规则描述都撤销,原来的 repeated 改为在类型或字段名后加一对中括号。这样是不是更简洁?

  3. 语言增加 Go、Ruby、JavaNano 支持;

  4. 移除了 default 选项;

    在 proto2 中,可以使用 default 选项为某一字段指定默认值。在 proto3 中,字段的默认值只能根据字段类型由系统决定。也就是说,默认值全部是约定好的,而不再提供指定默认值的语法。

    在字段被设置为默认值的时候,该字段不会被序列化。这样可以节省空间,提高效率。

    但这样就无法区分某字段是根本没赋值,还是赋值了默认值。这在 proto3 中问题不大,但在 proto2 中会有问题。

    比如,在更新协议的时候使用 default 选项为某个字段指定了一个与原来不同的默认值,旧代码获取到的该字段的值会与新代码不一样。

    另一个重约定而弱语法的例子是 Go 语言里的公共/私有对象。Go 语言约定,首字母大写的为公共对象,否则为私有对象。所以在 Go 语言中是没有 public、private 这样的语法的。

  5. 枚举类型的第一个字段必须为 0 ;

    这也是一个约定。

  6. 移除了对分组的支持;

    分组的功能完全可以用消息嵌套的方式来实现,并且更清晰。在 proto2 中已经把分组语法标注为『过期』了。这次也算清理垃圾了。

  7. 旧代码在解析新增字段时,会把不认识的字段丢弃,再序列化后新增的字段就没了;

    在 proto2 中,旧代码虽然会忽视不认识的新增字段,但并不会将其丢弃,再序列化的时候那些字段会被原样保留。

    我觉得还是 proto2 的处理方式更好一些。能尽量保持兼容性和扩展能力,或许实现起来也更简单。proto3 现在的处理方式,没有带来明显的好处,但丢掉了部分兼容性和灵活性。

  8. 移除了对扩展的支持,新增了 Any 类型;

    Any 类型是用来替代 proto2 中的扩展的。目前还在开发中。

    proto2 中的扩展特性很像 Swift 语言中的扩展。理解起来有点困难,使用起来更是会带来不少混乱。

    相比之下,proto3 中新增的 Any 类型有点想 C/C++ 中的 void* ,好理解,使用起来逻辑也更清晰。

  9. 增加了 JSON 映射特性;

    语言的活力来自于与时俱进。当前,JSON 的流行有其充分的理由。很多『现代化』的语言都内置了对 JSON 的支持,比如 Go、PHP 等。而 C++ 这种看似保罗万象的学院派语言,因循守旧、故步自封,以致于现出了式微的苗条。

Protobuf 的 proto3 与 proto2 的区别相关推荐

  1. proto3和proto2的区别

    转自:https://solicomo.com/network-dev/protobuf-proto3-vs-proto2.html proto3和proto2的区别 1.在第一行非空白非注释行,必须 ...

  2. 【Protocol Buffer】Protocol Buffer入门教程(三):proto3与proto2的区别

    总的来说,proto3 比 proto2 支持更多语言但 更简洁.去掉了一些复杂的语法和特性,更强调约定而弱化语法.如果是首次使用 Protobuf ,建议使用 proto3 . 在第一行非空白非注释 ...

  3. 正确使用 protobuf 的姿势

    Protobuf 总结 用途 Protobuf 是 google 出品的序列化框架,可跨平台.跨语言使用,扩展性良好.与 XML, JSON 等序列化框架相同,Protobuf 广泛的应用于数据存储, ...

  4. hbase协处理器编码实例

    Observer协处理器通常在一个特定的事件(诸如Get或Put)之前或之后发生,相当于RDBMS中的触发器.Endpoint协处理器则类似于RDBMS中的存储过程,因为它可以让你在RegionSer ...

  5. 一文读懂——Protobuf

    文章目录 简介 proto3 与 proto2 的区别 定义数据结构 字段类型 字段编号 字段规则 添加更多消息类型 添加注释 保留字段 默认值 定义枚举 编译.proto 文件 protoc编译 c ...

  6. 【C++】C/C++系列教程汇总(更新中......)

    文章目录 01. C语言基础 02. C开发实战 03. 数据结构 04. C++语言基础 05. C++核心编程 06. C++开发实战 07. MFC 08. QT 09. Visual Stud ...

  7. 【C/C++】C/C++博客汇总

    00. 目录 文章目录 00. 目录 01. C语言控制台相关文章 02. Protocol Buffers相关文章 03. C语言高级用法 04. 嵌入式C语言高级用法 本博客不断更新,敬请关注- ...

  8. proto2 proto3 变化

    总的来说,proto3 比 proto2 支持更多语言但 更简洁.去掉了一些复杂的语法和特性,更强调约定而弱化语法.如果是首次使用 Protobuf ,建议使用 proto3 . 1.在第一行非空白非 ...

  9. 深入理解 ProtoBuf 原理与工程实践(概述)

    ProtoBuf 作为一种跨平台.语言无关.可扩展的序列化结构数据的方法,已广泛应用于网络数据交换及存储.随着互联网的发展,系统的异构性会愈发突出,跨语言的需求会愈加明显,同时 gRPC 也大有取代R ...

最新文章

  1. webpack 优化笔记
  2. C++ 用vector创建数组对象
  3. C++中一个容易被忽视的名字查找规则
  4. AI顶会直播丨深度学习顶级会议ICLR 2021中国预讲会明天召开,为期三天五大论坛...
  5. 极端懒惰:使用Spring Boot开发JAX-RS服务
  6. 如何在GitHub上下载开源文件
  7. vue修改计算属性的值_「Vue学习记录五」计算属性和侦听器
  8. 東方 project 联机版开发日记(1)
  9. 苹果官网上架Apple Watch Series 3官翻机:1869元起
  10. python中unicode函数_中文字符 unicode转utf-8函数 python实现
  11. QT获取本机IP,本地IP
  12. FFmpeg之获取yuv分量(二十二)
  13. 区块链开发(一)搭建基于以太坊go-ethereum的私有链环境
  14. docker compose启动服务超时重启记录
  15. windows编程--网络编程学习--winsock编程(2)
  16. kmeans聚类理论篇
  17. ubuntu18 安装caj阅读器 wine
  18. 蘑菇街2016校园招聘第一个编程题
  19. 堆外内存(off-heap),堆内存(on-heap)
  20. Android API 中文(13) —— ToggleButton

热门文章

  1. CloudStack设计思想
  2. linux存储--虚拟内存详解MMU、页表(十)
  3. move std 函数 示例_确保(值类型)可拷贝类有默认构造函数
  4. python多进程存储数据_[b0035] python 归纳 (二十)_多进程数据共享和同步_共享内存Value Array...
  5. Sql Server实用操作-SQL语句导入导出大全
  6. SSH下的组合批量增加
  7. php: 通过key获取多维数组中的值
  8. 我在这里,等你的故事【小废回家看看】
  9. 【VBA研究】查找目录以下全部文件的名称
  10. 项目经理的几个重要转变