V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
index90
V2EX  ›  Go 编程语言

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

  •  
  •   index90 · 2019-02-15 16:23:29 +08:00 · 9585 次点击
    这是一个创建于 2109 天前的主题,其中的信息可能已经有所发展或是发生改变。

    要上 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 就是为了它的序列化性能。 有没有踩过坑的同学来讨论一下。

    13 条回复    2019-02-16 00:02:03 +08:00
    xomix
        1
    xomix  
       2019-02-15 16:46:30 +08:00
    正在 pb+rRpc 和 thrift 的坑中爬行,还挂着 zookeeper …………
    hilbertz
        2
    hilbertz  
       2019-02-15 16:50:55 +08:00
    你可以用 proto2,就算 google 内部主流仍然是用 proto2
    index90
        3
    index90  
    OP
       2019-02-15 16:51:47 +08:00
    @hilbertz 要用 gRPC 啊
    hilbertz
        4
    hilbertz  
       2019-02-15 16:54:15 +08:00
    @index90 grpc 根本不关心你用什么序列化协议
    zealot0630
        5
    zealot0630  
       2019-02-15 17:00:17 +08:00
    用 repeated fields,然后判断长度
    Sasasu
        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
    index90
        7
    index90  
    OP
       2019-02-15 17:12:31 +08:00
    @hilbertz G 家推荐用 pb3 作为 gRPC 的 IDL,貌似 pb2 也能用,不过既然 G 家推荐 pb3,估计以后就不支持 pb2 了,为了避免为以后留坑,还是用 pb3 吧。
    hilbertz
        8
    hilbertz  
       2019-02-15 17:17:26 +08:00
    @index90 这能有什么坑,2 和 3 的在二进制协议层面上根本没有区别,2 显然更适合描述接口设计
    loveuqian
        9
    loveuqian  
       2019-02-15 17:20:54 +08:00 via iPhone
    前端表示被这个坑惨了
    index90
        10
    index90  
    OP
       2019-02-15 17:22:59 +08:00
    @hilbertz 我说的坑是,哪天 gRPC 的 codegen 不支持用 pb2 来做 IDL 了
    index90
        11
    index90  
    OP
       2019-02-15 17:25:23 +08:00
    @loveuqian 你们前端现在用 grpc-web ?如果不用 gRPC 框架的话,也没必要换 pb3 了哇
    Sasasu
        12
    Sasasu  
       2019-02-15 17:26:41 +08:00
    protoc 的 "自举" 是在 pb2 上的,在可预见的未来 pb2 回像 py2 一样存在...
    richard1122
        13
    richard1122  
       2019-02-16 00:02:03 +08:00
    如果用 grpc 的同时还用 protobuf 给 http api 的话,不推荐 wrapper 的方式。

    我们目前大部分情况没有特别大的对 null 和默认值区分的需求,偶尔遇到一般这样:
    所有 enum 的 0 都表示未设置
    不得不需要区分的地方用 boolean 加 hasXXX
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   901 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:21 · PVG 04:21 · LAX 12:21 · JFK 15:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.