protobuf2和3差异(java版)

       Protocol Buffer是google于2008推出的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 和 json 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。现今经过多个版本迭代已经到了3.x版本。
  其实说白了Protocol Buffer就是一个协议,和解释器。可以用proto文件把model或者其他数据序列化Or反序列化(把二进制数据解析为Model或者把Model转为二进制数据)。

proto3 比 proto2 支持更多语言和功能,同时去掉了一些复杂的语法和特性,更强调约定而弱化语法。如果是首次使用 Protobuf ,建议使用 proto3 。接下来,我把prot3中和proto2的一些区别列出来。

首先介绍一下protobuf的下载,官网下载地址:Releases · protocolbuffers/protobuf · GitHub

选择不同的平台、版本进行下载。windows上,下载下来后文件夹中包含一个protoc.exe的可执行文件,结构如下:

protoc-3.0.2-win32.zip
-bin
 |-protoc.exe
-include
 |-google
  |-protobuf
    |-compiler
      |-plugin.proto
    |-any.proto
    |-api.proto
    |-descriptor.proto
    |-duration.proto
    |-empty.proto
    |-field_mask.proto
    |-source_context.proto
    |-struct.proto
    |-timestamp.proto
    |-type.proto
    |-wrappers.proto
   

1、proto3中,在第一行非空白非注释行,必须写:syntax = "proto3";

1)如果我们使用proto3的库,在文件中没有写这行,那么proto默认会使用proto2的语法进行编译,同时生成告警:

[libprotobuf WARNING google/protobuf/compiler/parser.cc:547] No syntax specified
 for the proto file: cinema.proto. Please use 'syntax = "proto2";' or 'syntax =
"proto3";' to specify a syntax version. (Defaulted to proto2 syntax.)

2)我们使用proto2的语法写了一个消息文件,然后用proto3编译(默认使用proto2编译),之后将生成的java类导入到工程中会报错(虽然是使用proto2进行的编译,但是在编译中还是会引入3的一些特性)。这时,maven需要升级protobuf-java到对应的版本(如:3.0.2)之后就好了。

所以,正确的做法是版本对其:使用proto3语法编写消息proto文件;使用proto3编译;项目中使用proto3库使用。

2、消息定义时,移除了 “required”、 “optional” :

因为 required 字段通常被认为是有害的并且违反了 protobuf 的兼容性语义。如果没有去除,使用proto3编译时会报错:

Required fields are not allowed in proto3.
Explicit 'optional' labels are disallowed in the Proto3

3、移除了 default 选项:

在 proto2 中,可以使用 default 选项为某一字段指定默认值。在 proto3 中,字段的默认值只能根据字段类型由系统决定。也就是说,默认值全部是约定好的,而不再提供指定默认值的语法。在字段被设置为默认值的时候,该字段不会被序列化。这样可以节省空间,提高效率。但这样就无法区分某字段是根本没赋值,还是赋值了默认值。

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

4、枚举类型的第一个字段必须为 0 :

定义枚举时如果下表从1开始会报错:

The first enum value must be zero in proto3

5、增加maps结构:

message Test {
  map<int32, bool> a = 1;
}

6、去掉extensions类型,使用Any新标准类型替换

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赶路人儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值