要上 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 就是为了它的序列化性能。 有没有踩过坑的同学来讨论一下。
1
xomix 2019-02-15 16:46:30 +08:00
正在 pb+rRpc 和 thrift 的坑中爬行,还挂着 zookeeper …………
|
2
hilbertz 2019-02-15 16:50:55 +08:00
你可以用 proto2,就算 google 内部主流仍然是用 proto2
|
5
zealot0630 2019-02-15 17:00:17 +08:00
用 repeated fields,然后判断长度
|
6
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 |
7
index90 OP @hilbertz G 家推荐用 pb3 作为 gRPC 的 IDL,貌似 pb2 也能用,不过既然 G 家推荐 pb3,估计以后就不支持 pb2 了,为了避免为以后留坑,还是用 pb3 吧。
|
9
loveuqian 2019-02-15 17:20:54 +08:00 via iPhone
前端表示被这个坑惨了
|
12
Sasasu 2019-02-15 17:26:41 +08:00
protoc 的 "自举" 是在 pb2 上的,在可预见的未来 pb2 回像 py2 一样存在...
|
13
richard1122 2019-02-16 00:02:03 +08:00
如果用 grpc 的同时还用 protobuf 给 http api 的话,不推荐 wrapper 的方式。
我们目前大部分情况没有特别大的对 null 和默认值区分的需求,偶尔遇到一般这样: 所有 enum 的 0 都表示未设置 不得不需要区分的地方用 boolean 加 hasXXX |