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

gle*_*nnr 30 protocol-buffers

协议缓冲区的一个吸引人的功能是它允许您扩展消息定义,而不会破坏使用旧定义的代码.在根据文档的枚举的情况下:

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

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

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

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

poo*_*lie 22

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

如果你想这样做,你也想使枚举是optional不是required.

required通常,意思是"我宁愿程序只是中止而不是处理它不理解的东西."

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

  • 我使用 Protocol Buffer Version 3 进行了测试,如果客户端尝试解组具有新值(尚未出现在客户端原型中)的枚举,它不会映射到第一个值(示例中的 UNKNOWN=0),它只是抛出异常。这种行为导致我使用 String 而不是 enum,因为它会在客户端和服务器之间创建耦合。 (2认同)