我有一个客户端 - 服务器应用程序,其中服务器将protobuf格式的序列化对象传输到客户端,我想退出required
字段。遗憾的是,我无法同时更改客户端和服务器以使用新的.proto
定义。
如果我将required
字段更改为optional
,但仅针对序列化消息的代码(即反序列化代码尚未重建并且仍然认为它是required
字段),只要我为现在的optional
字段填充值,我可以继续发布可以反序列化的消息吗?
(看起来这样做很好,至少对于我试验过的一些小事(只使用Java),但我感兴趣的是它是否是一种普遍合理的方法,以及是否有任何边缘情况等我应该担心)。
动机:我的目标是在客户端 - 服务器应用程序中淘汰required
字段,其中服务器发布由客户端反序列化的消息。我的预期方法是:
required
字段更改为主干上的optional
。答案 0 :(得分:20)
根据encoding format documentation,是否需要字段不是在串行化字节流本身中编码的。也就是说, optional
或required
在编码的序列化邮件中没有区别。
我已经在实践中证实了这一点,使用Java生成的代码,将序列化的消息写入磁盘并比较输出 - 使用包含所有支持的基元类型的消息以及表示其他类型的字段。
答案 1 :(得分:3)
只要设置了字段,使用parseFrom(byte[])
方法进行反序列化仍然有效,因为byte []将是相同的。
然而,有人会想知道为什么你要将字段从必需更改为可选字段,直到你准备允许它是可选的?基本上你只是在.proto文件中使它成为“可选”,但你强制要求总是填充它。只是一个想法。