Protobuf3 中关于区分默认值和缺失值问题

2019-02-15 16:23:29 +08:00
 index90

要上 gRPC 啦,由于 gRPC 要用 pb3,而 pb3 里面废除了 required 和 optional,所有字段都是 optional 了。我们面临如何判断某个字段是没值,还是默认值 0 的问题。

知乎上有个方法: https://zhuanlan.zhihu.com/p/46603988

也找到了 fieldmask 的方法: https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/field_mask.proto

Stack Overflow 上也有增加 null 字段做法: https://stackoverflow.com/questions/42622015/how-to-define-an-optional-field-in-protobuf-3

不知道哪种更好,前提是,pb 的序列化性不能退化,毕竟从 json 换 pb 就是为了它的序列化性能。 有没有踩过坑的同学来讨论一下。

9443 次点击
所在节点    Go 编程语言
13 条回复
xomix
2019-02-15 16:46:30 +08:00
正在 pb+rRpc 和 thrift 的坑中爬行,还挂着 zookeeper …………
hilbertz
2019-02-15 16:50:55 +08:00
你可以用 proto2,就算 google 内部主流仍然是用 proto2
index90
2019-02-15 16:51:47 +08:00
@hilbertz 要用 gRPC 啊
hilbertz
2019-02-15 16:54:15 +08:00
@index90 grpc 根本不关心你用什么序列化协议
zealot0630
2019-02-15 17:00:17 +08:00
用 repeated fields,然后判断长度
Sasasu
2019-02-15 17:12:12 +08:00
用 wrappers.
不退化, 但是需要写一大堆 `google.protobuf.XxxXxx`

https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/wrappers.proto
index90
2019-02-15 17:12:31 +08:00
@hilbertz G 家推荐用 pb3 作为 gRPC 的 IDL,貌似 pb2 也能用,不过既然 G 家推荐 pb3,估计以后就不支持 pb2 了,为了避免为以后留坑,还是用 pb3 吧。
hilbertz
2019-02-15 17:17:26 +08:00
@index90 这能有什么坑,2 和 3 的在二进制协议层面上根本没有区别,2 显然更适合描述接口设计
loveuqian
2019-02-15 17:20:54 +08:00
前端表示被这个坑惨了
index90
2019-02-15 17:22:59 +08:00
@hilbertz 我说的坑是,哪天 gRPC 的 codegen 不支持用 pb2 来做 IDL 了
index90
2019-02-15 17:25:23 +08:00
@loveuqian 你们前端现在用 grpc-web ?如果不用 gRPC 框架的话,也没必要换 pb3 了哇
Sasasu
2019-02-15 17:26:41 +08:00
protoc 的 "自举" 是在 pb2 上的,在可预见的未来 pb2 回像 py2 一样存在...
richard1122
2019-02-16 00:02:03 +08:00
如果用 grpc 的同时还用 protobuf 给 http api 的话,不推荐 wrapper 的方式。

我们目前大部分情况没有特别大的对 null 和默认值区分的需求,偶尔遇到一般这样:
所有 enum 的 0 都表示未设置
不得不需要区分的地方用 boolean 加 hasXXX

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/535379

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX