37

协议缓冲区的吸引人的特性之一是它允许您在不破坏使用旧定义的代码的情况下扩展消息定义。根据文档,如果是枚举:

具有枚举类型的字段只能将指定的一组常量作为其值(如果您尝试提供不同的值,解析器会将其视为未知字段)

因此,如果您扩展枚举并使用新值,则旧代码中具有该类型的字段将未定义或具有其默认值(如果有)。

知道将来枚举可能会增加额外的值,什么是处理这个问题的好策略?

想到的一种方法是定义枚举的“未定义”成员并将其设为默认值,然后旧代码将知道它已发送无法解释的内容。这是明智的,有没有更好的方法来处理这种情况?

4

2 回答 2

31

是的,最好的方法是使枚举中的第一个值类似于UNKNOWN = 0. 然后旧程序读取带有他们无法识别的枚举值的 protobuf 将看到它,UNKNOWN并希望他们可以合理地处理它,例如通过跳过该元素。

如果你想这样做,你还想让 enum 成为optionalnot required

required,一般来说,意思是“我宁愿程序只是中止而不是处理它不理解的东西。”

请注意,它必须是 proto 源中声明的第一个值- 只是零值并不能使其成为默认值。

于 2013-06-18T08:52:59.027 回答