サーバーがシリアル化されたオブジェクトをprotobuf形式でクライアントに送信するクライアントサーバーアプリケーションがあり、requiredフィールドを廃止したいと思います。.proto残念ながら、新しい定義を使用するためにクライアントとサーバーの両方を同時に変更することはできません。
requiredフィールドをに変更した場合、メッセージをシリアル化optionalするコードのみ(つまり、逆シリアル化コードが再構築されておらず、それがフィールドであると見なされる場合) 、値を入力する限り、逆シリアル化できるメッセージを公開し続けることができます。今-フィールド?requiredoptional
(少なくとも私が実験したいくつかの些細なケース(Javaのみを使用)ではそうすることは問題ないようですが、それが一般的に賢明なアプローチであるかどうか、そしてエッジケースなどがあるかどうかについて心配する必要があります)。
動機:私の目標はrequired、サーバーがクライアントによって逆シリアル化されたメッセージを公開するクライアントサーバーアプリケーションのフィールドを廃止することです。私の意図するアプローチは次のとおりです。
- トランクの
requiredフィールドをに変更します。optional - (関連のない機能/修正のために)新しいサーバーコードを展開する必要がある場合は、オプションのフィールドがメッセージに引き続き入力されていることを確認してください。
- すべてのクライアントに更新されたコードを段階的に展開します(独自のリリーススケジュールを持つ他のチームの関与が必要になるため、これには時間がかかります)
- すべてのクライアントが更新されたことを確認します。
- オプションフィールドの廃止(つまり、入力しない)を開始します。