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