为什么protob2 .protos的protobuf-net没有为必填字段生成默认值?

时间:2017-08-29 18:46:20

标签: .net protocol-buffers protobuf-net

使用最新的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字段,因为它已经由默认值设置。为什么不是这样?

1 个答案:

答案 0 :(得分:1)

这是混淆的常见原因。默认值不会做您期望他们做的事情。

默认值确切地说:"如果没有调用此字段的setter(或者从电线解析消息,并且此字段不在那里),那么getter for this字段应返回此值。"

默认值完全是本地的。它们永远不会通过电线发送。

这意味着为必填字段设置默认值通常是无用的。它唯一能做的就是确定首次创建对象时字段的getter方法将返回什么。

另请注意,required字段的目的是强制邮件的发件人在发送之前调用字段的setter。如果您不想要求发件人明确设置字段,则应声明字段optional。 (实际上,您应该始终声明字段optional,而不是required,而是that's another story。)

(披露:我是proto2-c ++,protoc和Cap' n Proto的作者,但不是proto3。)