Protocol Buffer 可选整数,不同于零
Protocol Buffer optional integer, distinct from zero
在 Protocol Buffer 版本 3 中,我试图找出获得可选整数值的最佳方法,其中零和不存在应该是不同的情况。我能想到的最好的是打字:
message int64Option {
oneof option {
bool empty = 14;
int64 value = 15;
}
}
这是个好主意,还是有更好的方法?
在 proto3 中有两个主要选项。第一种是像你建议的那样使用 oneof
,但实际上你只需要在 oneof
:
中有一个项目
oneof option {
int64 value = 15;
}
其中一个字段具有存在的概念,因此您仍然可以确定 value
是不存在还是为零。另一种选择是使用 google/protobuf/wrappers.proto 中的一种包装器类型。这些包装器中的每一个都只采用一个原始类型并将其包装在一条消息中,这对您的情况有帮助,因为存在子消息字段。这是 Int64
包装器的样子,例如:
// Wrapper message for `int64`.
//
// The JSON representation for `Int64Value` is JSON string.
message Int64Value {
// The int64 value.
int64 value = 1;
}
最后,要考虑的另一件事是您可以始终继续使用 proto2。 protobuf 3.0 及更高版本支持 proto2 和 proto3 样式,我们计划无限期地继续支持 proto2。
在 Protocol Buffer 版本 3 中,我试图找出获得可选整数值的最佳方法,其中零和不存在应该是不同的情况。我能想到的最好的是打字:
message int64Option {
oneof option {
bool empty = 14;
int64 value = 15;
}
}
这是个好主意,还是有更好的方法?
在 proto3 中有两个主要选项。第一种是像你建议的那样使用 oneof
,但实际上你只需要在 oneof
:
oneof option {
int64 value = 15;
}
其中一个字段具有存在的概念,因此您仍然可以确定 value
是不存在还是为零。另一种选择是使用 google/protobuf/wrappers.proto 中的一种包装器类型。这些包装器中的每一个都只采用一个原始类型并将其包装在一条消息中,这对您的情况有帮助,因为存在子消息字段。这是 Int64
包装器的样子,例如:
// Wrapper message for `int64`.
//
// The JSON representation for `Int64Value` is JSON string.
message Int64Value {
// The int64 value.
int64 value = 1;
}
最后,要考虑的另一件事是您可以始终继续使用 proto2。 protobuf 3.0 及更高版本支持 proto2 和 proto3 样式,我们计划无限期地继续支持 proto2。