在协议缓冲区版本3中,我试图找出具有可选整数值的最佳方法,其中零和缺席应该是不同的情况。我能说的最好的是制作一种类型:
message int64Option {
oneof option {
bool empty = 14;
int64 value = 15;
}
}
这是一个好主意,还是有更好的方法?
答案 0 :(得分:2)
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。