【发布时间】:2021-03-06 16:12:23
【问题描述】:
以下是我的 protobuf 定义:
enum Foo {
BAR = 0;
BAZ = 1;
}
message UpdateRequest {
string id = 1;
Foo foo = 2;
.
.
.
}
我需要 UpdateRequest 的 foo 字段可以为空。但是,如果我不设置此字段的值,那么根据 protobuf 语义,它总是最终选择 BAR 作为默认值。
环顾四周,我找到了几种处理方法。
- 在枚举中添加一个额外的
UNKNOWN值并将其映射到0,这样该值将用作默认值而不是BAR,我可以将此值视为null。
enum Foo {
UNKNOWN = 0;
BAR = 1;
BAZ = 2;
}
- 使用
oneof构造。
但是,不知何故,我觉得上述两种方法都是一种解决方法,我无法找到解释处理这种情况的最佳实践的官方文档。
处理此用例的最佳做法是什么?
【问题讨论】:
-
你为什么不喜欢第一种方法?有关最佳实践,您可以查看:developers.google.com/protocol-buffers/docs/proto3#enum 或 developers.google.com/protocol-buffers/docs/reference/…
-
@SanP 感谢您对最佳实践的引用。我最终只使用了第一种方法。我还注意到对可选属性有实验性支持,这对我来说看起来更干净,但不幸的是我无法在我们的生产代码中使用该实验性功能。关于第一种方法,一个令人讨厌的事情是枚举的范围语义。即我必须在整个 proto 文件中保持唯一,这意味着我将不得不使用
UNKNOWN_FOO而不是UNKNOWN。
标签: java protocol-buffers grpc grpc-java