37

プロトコルバッファの魅力的な機能の1つは、古い定義を使用するコードを壊すことなくメッセージ定義を拡張できることです。ドキュメントによると列挙型の場合:

列挙型のフィールドは、その値として指定された定数のセットの1つのみを持つことができます(別の値を提供しようとすると、パーサーはそれを未知のフィールドのように扱います)

したがって、列挙型を拡張して新しい値を使用すると、古いコードでそのタイプのフィールドが未定義になるか、デフォルト値がある場合はその値になります。

将来、列挙型に追加の値が追加される可能性があることを知って、これに対処するための良い戦略は何ですか?

頭に浮かぶ1つの方法は、列挙型の「未定義」メンバーを定義し、それをデフォルトにすることです。そうすれば、古いコードは、解釈できないものが送信されたことを認識します。それは賢明ですか、この状況に対処するためのより良い方法はありますか?

4

2 に答える 2

31

はい、最善のアプローチは、列挙型の最初の値をのようなものにすることですUNKNOWN = 0。次に、認識できない列挙値を持つprotobufを読み取る古いプログラムは、それを認識しUNKNOWN、うまくいけば、その要素をスキップするなどして、それを合理的に処理できるようになります。

これを実行したい場合は、列挙型をそうでoptionalはないようにすることもできますrequired

required、一般的には、「理解できないものを処理するよりも、プログラムを中止したい」という意味です。

これは、プロトソースで宣言された最初の値でなければならないことに注意してください。ゼロ値であるだけでは、デフォルトにはなりません。

于 2013-06-18T08:52:59.027 に答える