我有一个客户端-服务器应用程序,其中服务器以protobuf格式传输经序列化的对象到客户端,并且我想要去除一个required
字段。不幸的是,我不能同时更改客户端和服务器来使用新的.proto
定义。
如果我将一个required
字段更改为optional
,但仅在代码中序列化消息时更改(即反序列化代码未被重建,并且仍然认为它是required
字段),我是否可以继续发布可被反序列化的消息只要我填充现在optional
字段的值即可?
(至少对于我尝试过的一些简单情况(仅使用Java),这样做似乎没问题,但我想知道它是否是一种通常明智的方法,以及是否存在任何需要担心的边缘情况等)。
动机:我的目标是在一个客户端-服务器应用程序中退役一个required
字段,其中服务器发布由客户端反序列化的消息。我的打算的方法是:
- 在主干上将
required
字段更改为optional
。 - 如果需要部署新的服务器代码(用于其他功能/修复),请确保在消息中继续填充可选字段。
- 逐步部署所有客户端的更新代码(这需要时间,因为它需要涉及到具有自己发布计划的其他团队)。
- 确认所有客户端都已更新。
- 开始退役(即不再填充)可选字段。