注意:所有这些都与协议缓冲区版本3有关.
让我们说,我们有一个信息
message Foo {
int32 weight_in_lbs;
}
此消息的制作者希望停止生产以磅为单位的重量,而希望以公斤为单位生产它.
因此,我们不推荐使用lbs字段,而添加了kgs字段.
message Foo {
int32 weight_in_lbs [deprecated = true];
int32 weight_in_kgs;
}
正在分发的生产者(多台服务器)不能一下子升级.因此,在某一时刻,我们将让生产者生产新旧消息类型的消息.
理想情况下,消费者应该同时 Select weight_in_lbs
和weight_in_kgs
,如果有的话,更喜欢后者,否则就求助于前者.但是在Proto3中,不可能判断某个字段是否真的没有设置,或者实际上是由生产者设置为缺省值.documentation人推荐以下两种之一:
- 将该字段包装在一条消息中,这样我们就可以使用
HasField()
- 将该字段标记为可选(他们说不建议这样做)
这些选项中哪一个更可取?有没有第三种 Select ?在我的编程模式中,使用者try 阅读新旧字段并从中进行 Select ,这是不是有问题?