为什么 proto3 中没有自定义默认值?
Why are there no custom default values in proto3?
协议缓冲区的 proto2 版本允许为消息元素指定默认值:
optional double scaling_factor = 3 [default = 1.0];
为什么这在 proto3 中不再可能?我认为这是一个很好的功能,可以在网络上节省额外的字节,而无需编写任何包装代码。
我的理解是 proto3 不再允许您检测字段存在并且不再支持非零默认值,因为这使得根据 "plain old structs" 以各种语言实现 protobufs 变得更容易,而不需要生成访问器方法。这被认为使 Protobuf 更易于在这些语言中使用。
(我个人认为缺少访问器和属性的语言不是很好的语言,protobuf 不应该针对它们进行设计,但这不再是我的项目。)
在我自动生成的文件 .pb.cc 中,我很少看到这样的地方:
if (this->myint() != 0) {
很少有人像这样:
myint_ = 0;
那么,为什么不启用默认值并生成
static ::google::protobuf::int32 myint_defaultvalue = 5;
...
if (this->myint() != myint_defaultvalue) {
...
...
myint_ = myint_defaultvalue;
...
代替?
这是一种解决方法,而不是直接回答您的问题,但我发现自己使用了 wrappers.proto 可选值,然后在我绝对必须知道这是否是默认值或明确设置的值。
您的代码必须强制执行该值而不是生成的代码本身,这不是最佳选择,但如果您拥有双方,至少这是一个可行的替代方案,而不是不知道该值是默认值还是明确设置的,尤其是在查看 bool 设置为 false 时。
我不清楚这对网络中的字节有何影响。对于我使用它的实例,消息长度不是设计约束。
原型文件
import "google/protobuf/wrappers.proto";
google.protobuf.BoolValue optional_bool = 1;
Java代码
//load or receive message here
if( !message.hasOptionalBool() )
message.setOptionalBool( BoolValue.newBuilder().setValue( true ) );
协议缓冲区的 proto2 版本允许为消息元素指定默认值:
optional double scaling_factor = 3 [default = 1.0];
为什么这在 proto3 中不再可能?我认为这是一个很好的功能,可以在网络上节省额外的字节,而无需编写任何包装代码。
我的理解是 proto3 不再允许您检测字段存在并且不再支持非零默认值,因为这使得根据 "plain old structs" 以各种语言实现 protobufs 变得更容易,而不需要生成访问器方法。这被认为使 Protobuf 更易于在这些语言中使用。
(我个人认为缺少访问器和属性的语言不是很好的语言,protobuf 不应该针对它们进行设计,但这不再是我的项目。)
在我自动生成的文件 .pb.cc 中,我很少看到这样的地方:
if (this->myint() != 0) {
很少有人像这样:
myint_ = 0;
那么,为什么不启用默认值并生成
static ::google::protobuf::int32 myint_defaultvalue = 5;
...
if (this->myint() != myint_defaultvalue) {
...
...
myint_ = myint_defaultvalue;
...
代替?
这是一种解决方法,而不是直接回答您的问题,但我发现自己使用了 wrappers.proto 可选值,然后在我绝对必须知道这是否是默认值或明确设置的值。
您的代码必须强制执行该值而不是生成的代码本身,这不是最佳选择,但如果您拥有双方,至少这是一个可行的替代方案,而不是不知道该值是默认值还是明确设置的,尤其是在查看 bool 设置为 false 时。
我不清楚这对网络中的字节有何影响。对于我使用它的实例,消息长度不是设计约束。
原型文件
import "google/protobuf/wrappers.proto";
google.protobuf.BoolValue optional_bool = 1;
Java代码
//load or receive message here
if( !message.hasOptionalBool() )
message.setOptionalBool( BoolValue.newBuilder().setValue( true ) );