为什么 proto2 .protos 的 protobuf-net 不为必填字段生成默认值?
Why doesn't protobuf-net for proto2 .protos generate default values for required fields?
上对 proto2 .proto 文件使用最新的 protobuf-net
syntax = "proto2";
message my_message {
optional string val1 = 1 [default="hello!"];
required uint32 val2 = 2 [default="4"];
}
对于可选字段 val1,它正确地添加了默认值的代码,但是它没有为所需的 val2 生成。我期望它会生成相同的代码,而且我不必显式设置 val2 字段,因为它已经设置为默认值。为什么不是这样?
这是一个常见的混淆来源。默认值不符合您的预期。
默认值表示:"If the setter for this field has not been called (or the message was parsed from the wire, and this field wasn't present there), then getter for this field should return this value."
默认值完全是本地的。它们永远不会通过网络发送。
这意味着为必填字段设置默认值几乎没有用。它所做的唯一一件事就是确定首次创建对象时字段的 getter 方法 return。
另请注意,required
字段的目的是强制消息的发件人在发送前调用该字段的 setter。如果您不想要求发件人显式设置该字段,那么您应该声明该字段optional
。 (实际上,您应该始终声明字段 optional
,绝不是 required
,而是 that's another story。)
(披露:我是 proto2-c++、protoc 和 Cap'n Proto 的作者,但不是 proto3。)
syntax = "proto2";
message my_message {
optional string val1 = 1 [default="hello!"];
required uint32 val2 = 2 [default="4"];
}
对于可选字段 val1,它正确地添加了默认值的代码,但是它没有为所需的 val2 生成。我期望它会生成相同的代码,而且我不必显式设置 val2 字段,因为它已经设置为默认值。为什么不是这样?
这是一个常见的混淆来源。默认值不符合您的预期。
默认值表示:"If the setter for this field has not been called (or the message was parsed from the wire, and this field wasn't present there), then getter for this field should return this value."
默认值完全是本地的。它们永远不会通过网络发送。
这意味着为必填字段设置默认值几乎没有用。它所做的唯一一件事就是确定首次创建对象时字段的 getter 方法 return。
另请注意,required
字段的目的是强制消息的发件人在发送前调用该字段的 setter。如果您不想要求发件人显式设置该字段,那么您应该声明该字段optional
。 (实际上,您应该始终声明字段 optional
,绝不是 required
,而是 that's another story。)
(披露:我是 proto2-c++、protoc 和 Cap'n Proto 的作者,但不是 proto3。)