如何在协议缓冲区中设计未来的额外枚举值?

时间:2012-05-01 02:45:39

标签: protocol-buffers

协议缓冲区的一个吸引人的功能是它允许您扩展消息定义而不会破坏使用旧定义的代码。如果是枚举according to the documentation

  

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

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

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

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

1 个答案:

答案 0 :(得分:20)

是的,最好的方法是将枚举中的第一个值设为UNKNOWN = 0。然后读取具有枚举值的原始程序的旧程序将不会识别为UNKNOWN,并希望它们可以合理地处理,例如跳过该元素。

如果您想这样做,您还需要将枚举设为optional而不是required

required,通常意味着“我宁愿程序只是中止而不是处理它不理解的东西。”

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