【问题标题】:How to handle a nullable enum type field in a protobuf3 message?如何处理 protobuf3 消息中可为空的枚举类型字段?
【发布时间】:2021-03-06 16:12:23
【问题描述】:

以下是我的 protobuf 定义:

enum Foo {
   BAR = 0;
   BAZ = 1;      
}

message UpdateRequest {
  string id = 1;
  Foo foo = 2;
  .
  .
  .
}

我需要 UpdateRequestfoo 字段可以为空。但是,如果我不设置此字段的值,那么根据 protobuf 语义,它总是最终选择 BAR 作为默认值。

环顾四周,我找到了几种处理方法。

  1. 在枚举中添加一个额外的UNKNOWN 值并将其映射到0,这样该值将用作默认值而不是BAR,我可以将此值视为null。
enum Foo {
   UNKNOWN = 0;
   BAR = 1;
   BAZ = 2;      
}
  1. 使用oneof 构造。

但是,不知何故,我觉得上述两种方法都是一种解决方法,我无法找到解释处理这种情况的最佳实践的官方文档。

处理此用例的最佳做法是什么?

【问题讨论】:

  • 你为什么不喜欢第一种方法?有关最佳实践,您可以查看:developers.google.com/protocol-buffers/docs/proto3#enumdevelopers.google.com/protocol-buffers/docs/reference/…
  • @SanP 感谢您对最佳实践的引用。我最终只使用了第一种方法。我还注意到对可选属性有实验性支持,这对我来说看起来更干净,但不幸的是我无法在我们的生产代码中使用该实验性功能。关于第一种方法,一个令人讨厌的事情是枚举的范围语义。即我必须在整个 proto 文件中保持唯一,这意味着我将不得不使用 UNKNOWN_FOO 而不是 UNKNOWN

标签: java protocol-buffers grpc grpc-java


【解决方案1】:

您应该能够使用hasFoo() 检查该字段,而getFoo() 将返回BARhasFoo() 应返回false

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2020-11-11
    • 1970-01-01
    • 2021-09-02
    相关资源
    最近更新 更多