【发布时间】:2012-05-01 02:45:38
【问题描述】:
协议缓冲区的一个吸引人的特性是它允许您在不破坏使用旧定义的代码的情况下扩展消息定义。在枚举according to the documentation的情况下:
具有枚举类型的字段只能将一组指定的常量作为其值(如果您尝试提供不同的值,解析器会将其视为未知字段)
因此,如果您扩展枚举并使用新值,则旧代码中具有该类型的字段将未定义或具有其默认值(如果有)。
什么是处理这个问题的好策略,知道将来枚举可能会添加额外的值?
想到的一种方法是定义枚举的“未定义”成员并将其设为默认值,然后旧代码将知道它已发送无法解释的内容。这是否明智,有没有更好的方法来处理这种情况?
【问题讨论】:
-
另一种解决方案是永远不要向现有枚举添加值,而是添加一个新枚举。
-
从我今天一直盯着的代码(Java)来看,尚不清楚默认值是否有帮助。枚举字段已经有一个默认值(枚举的第一个值),但该值已分配并取消设置。因此,isInitialized() 失败,因为对所需字段的扫描发现 hasField 布尔值为 false。枚举,必需,可扩展 - 选择任意两个?
-
@VoiceOfUnreason:正确:如果您要求枚举,意外值将被视为不兼容。只有当它是可选的时,才有默认值。
标签: protocol-buffers