java 如何处理protobuf3消息中的可空枚举类型字段?

zu0ti5jz  于 2023-01-07  发布在  Java
关注(0)|答案(2)|浏览(363)

下面是我的protobuf定义:

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

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

我需要UpdateRequestfoo字段可以为空,但是,如果我不设置这个字段的值,那么根据protobuf语义,它总是选择BAR作为默认值。
环顾四周,我找到了几个解决办法。
1.在枚举中添加一个额外的UNKNOWN值,并将其Map到0,以便将此值用作默认值,而不是BAR,我可以将此值视为空值。

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

1.使用oneof结构。
然而,不知何故,我觉得上述两种方法都是一种变通办法,我无法找到解释处理这种情况的最佳做法的官方文档。
处理此使用情形的最佳做法是什么?

wpcxdonn

wpcxdonn1#

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

6vl6ewon

6vl6ewon2#

仅当不希望使用UNKNOWN枚举值时才继续阅读。
不知道这是否是最佳实践,但每当我发送对象本身的值不能为空时,我使用enum值,而在请求(如UpdateRequest)中,当它可以为空时,我使用string类型代替,并手动处理转换。

message Object {
  EnumProperty property = 1;

  enum EnumProperty {
    FIRST = 0;
    SECOND = 1;
    THIRD = 2;
  }
}

message ObjectUpdateRequest {
  string property = 1;
}

相关问题