2017-08-29 83 views
1

採用最新的protobuf網爲proto2 .proto我嘗試了Marc's site's generator文件:爲什麼protobuf-net for proto2 .protos爲必填字段生成默認值?

syntax = "proto2"; 

message my_message { 
    optional string val1 = 1 [default="hello!"]; 
    required uint32 val2 = 2 [default="4"]; 
} 

對於可選字段VAL1它正確地增加了對默認值的代碼,但它不是必需的VAL2產生。我期待它會生成相同的代碼,我不必顯式設置val2字段,因爲它已經由默認值設置。爲什麼不是這種情況?

回答

1

這是一個常見的混淆來源。默認值不會做你期望他們做的事情。

默認值說的是:「如果這個字段的setter沒有被調用(或者消息是從線中解析出來的,並且這個字段不存在),那麼這個字段的getter應該返回這個值。」

默認值完全是本地的。他們絕不會通過電線發送。

這意味着爲必填字段設置默認值是無用的。它所做的唯一事情就是確定該對象第一次創建時該字段的getter方法將返回的內容。

另請注意,required字段的用途是在發送之前強制郵件的發件人調用字段的設置器。如果您不想要求發件人明確設置字段,則應聲明字段optional。 (實際上,你應該總是聲明字段optional,從來沒有required,但that's another story

(披露:我proto2-C++,protoc和頭兒原的作家,但不是proto3)

相關問題