2017-08-29 10 views
1

:それは正しく、デフォルト値のためのコードを追加しますval1とオプションのフィールドについてはproto2 .protosのprotobuf-netが必須フィールドのデフォルト値を生成しないのはなぜですか?私は<a href="https://protogen.marcgravell.com/" rel="nofollow noreferrer">Marc's site's generator</a>にしようとしたファイル.proto proto2の最新いるProtobufネットを使用して

syntax = "proto2"; 

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

、しかしこれは必須ではありval2のために生成されていません。私はそれが同じコードを生成すると期待していたので、val2フィールドがデフォルト値で既に設定されているため、val2フィールドを明示的に設定する必要はありませんでした。なぜこれは当てはまりませんか?

答えて

1

これはよくある混乱の原因です。デフォルト値はあなたが期待していることをしません。

デフォルト値は「このフィールドの設定者が呼び出されていない(またはメッセージがワイヤから解析され、そこにこのフィールドが存在しない)場合、このフィールドのゲッターはこれを返す必要があります値。"

デフォルト値は完全にローカルです。彼らは決して電線に送られることはありません。

これは、必須フィールドのデフォルト値を設定することはほとんど役に立たないことを意味します。それが行う唯一のことは、オブジェクトが最初に作成されたときにフィールドのゲッターメソッドが返すものを決定することです。

requiredフィールドの目的は、メッセージの送信者が送信する前にフィールドのセッターを強制的に呼び出すことです。送信者にフィールドを明示的に設定する必要がない場合は、フィールドoptionalを宣言する必要があります。 (実際には、あなたは常にフィールドoptional、決してrequiredが、that's another storyを宣言する必要があります)

(情報開示:私はproto2-C++、protoc、と船長プロトの作者だけど、proto3ません。)

関連する問題

 関連する問題