金庆的专栏

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  423 随笔 :: 0 文章 :: 454 评论 :: 0 Trackbacks
protobuf中的枚举缺省值应该为UNKNOWN

(金庆的专栏)

proto3中的枚举值为了与proto2兼容,要求缺省值固定为第1个,值为0。
proto2中并没有规定对范围之外的枚举值的处理,
而proto3中已规定无定义的枚举值反序列化后再次序列化保持原值。

lua pbc 中对无定义的枚举值做了忽略处理,效果等同于变成缺省值。
希望未来版本能符合proto3的规定。

协议定义中添加新的枚举值是常有的,客户端服务器协议版本不同时,
就会出现无定义的枚举值。

如果缺省值为UNKNOWN, 则所有新增或已删除枚举值都按缺省值处理就不会出错。

缺点是要求所有枚举值都要显式赋值,不能使用缺省值了。

例如,原来定义为
    enum LoginResult {
        OK = 0;
        ERR_SERVER_FULL = 1;  // 服务器已满
        ERR_VERIFY_FAIL = 2;  // 验证失败
        ERR_MULTI_LOGIN = 3;  // 重复登录
    }
多数情况下,仅需缺省OK就行了。
但是服务器再添加一个 ERR_NOT_READY, 客户端因为使用旧版协议,
遇见ERR_NOT_READY最终返回缺省值 OK.


posted on 2016-08-16 12:13 金庆 阅读(1030) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理