Protobuf 的 proto3 与 proto2 的区别

简介:

这是一篇学习笔记。在粗略的看了 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++ 这种看似保罗万象的学院派语言,因循守旧、故步自封,以致于现出了式微的苗条。

目录
相关文章
|
Dubbo Java 应用服务中间件
深入Dubbo异步化:探索AsyncContext的神奇之处
深入Dubbo异步化:探索AsyncContext的神奇之处
509 0
|
11月前
|
数据可视化 数据处理 数据库
《重塑认知:Django MVT架构的多维剖析与实践》
MVT(Model-View-Template)是Django框架的核心架构模式,将应用分为模型、视图和模板三部分。模型负责数据处理与验证,视图承载业务逻辑并连接用户请求与数据,模板则专注于数据展示。这种清晰的分工降低了模块耦合度,提高了代码复用性和可维护性。MVT架构如同一场精密协作的演出,从URL分发到数据处理,再到页面渲染,每一步都环环相扣,为开发者带来高效、灵活的Web应用开发体验。
231 0
|
JSON Go PHP
Protobuf 的 proto3 与 proto2 的区别
Protobuf 的 proto3 与 proto2 的区别
666 0
|
数据管理 数据处理 数据库
数据库中的 ACID 属性详解
【8月更文挑战第31天】
1442 0
|
存储 运维 监控
从零入门 Serverless | 一文搞懂函数计算及其工作原理
在 Serverless 架构下,开发者只需要关注应用的开发构建和部署,无需关心服务器相关操作与运维。在函数计算架构下,开发者只需要编写业务代码并监控业务运行情况。这将开发者从繁重的运维工作中解放出来,把精力投入到更有意义的业务开发上。
从零入门 Serverless | 一文搞懂函数计算及其工作原理
|
机器学习/深度学习 存储 C语言
NumPy源码解析:实现原理探究
【4月更文挑战第17天】本文深入解析NumPy源码,探讨其高效性能背后的实现原理。核心是多维数组`ndarray`,基于同质数据、连续内存分配和形状步幅概念。NumPy利用C语言实现数组管理,通过广播机制允许不同形状数组运算,并借助底层线性代数库实现向量化操作。理解这些机制有助于优化科学计算并应用于其他项目。
1311 1
|
数据安全/隐私保护 Android开发 芯片
wpa_supplicant介绍
wpa_supplicant介绍
488 1
|
存储 SQL 分布式计算
当流计算邂逅数据湖:Paimon 的前生今世
希望通过笔者以下的经历,回顾流计算一步一步扩大场景的过程,并引出 Apache Paimon 的前生今世。
2128 0
当流计算邂逅数据湖:Paimon 的前生今世
|
存储 监控 数据可视化
Golang链路追踪:实现高效可靠的分布式系统监控
Golang链路追踪:实现高效可靠的分布式系统监控

热门文章

最新文章

下一篇
开通oss服务