使用最新的protobuf-net for proto2 .proto文件我尝试了Marc's site's generator:
syntax = "proto2";
message my_message {
optional string val1 = 1 [default="hello!"];
required uint32 val2 = 2 [default="4"];
}
对于可选字段val1,它正确地添加了默认值的代码,但是没有为所需的val2生成它。我期望它会生成相同的代码,我不必显式设置val2字段,因为它已经由默认值设置。为什么不是这样?
答案 0 :(得分:1)
这是混淆的常见原因。默认值不会做您期望他们做的事情。
默认值确切地说:"如果没有调用此字段的setter(或者从电线解析消息,并且此字段不在那里),那么getter for this字段应返回此值。"
默认值完全是本地的。它们永远不会通过电线发送。
这意味着为必填字段设置默认值通常是无用的。它唯一能做的就是确定首次创建对象时字段的getter方法将返回什么。
另请注意,required
字段的目的是强制邮件的发件人在发送之前调用字段的setter。如果您不想要求发件人明确设置字段,则应声明字段optional
。 (实际上,您应该始终声明字段optional
,而不是required
,而是that's another story。)
(披露:我是proto2-c ++,protoc和Cap' n Proto的作者,但不是proto3。)