【发布时间】:2015-10-18 23:17:12
【问题描述】:
我正在尝试升级到使用 protobuf 版本 3,并保持与版本 2 的向后兼容。除了一件事之外似乎可以工作 - 在 proto-2 中您可以设置自己的默认值,但在 proto 3 中,您可以不。如果您在 proto-2 中选择的默认值不是 proto-3 中的标准默认值,那么您就有问题了。例如,在 proto-2 中:
message Record {
required uint32 fileno = 1;
required uint64 pos = 2;
optional uint64 bmsPos = 3 [default = 0];
optional uint32 scanMode = 4 [default = 9999];
}
现在在 proto-3 中必须是:
message Record {
uint32 fileno = 1;
uint64 pos = 2;
uint64 bmsPos = 3;
uint32 scanMode = 4;
}
在 proto-2 和 proto-3 中,缺失值不会在消息中发送。但是 proto-3 API 并没有告诉你默认值是否在消息中,它只是告诉你这个值。
所以 proto-3 接收器收到一条消息并告诉我 scanMode = 0。如果该消息来自 proto-2 发件人,则 1) proto-2 发件人在消息中放置 0,或 2) proto-2 发件人将值设置为 9999(默认值),因此值未发送,并且 proto-3 接收器将其解释为 0。在不知道消息中是否存在该值的情况下,我的代码无法消除歧义,即使它知道消息是否来自 proto-2 或proto-3 发件人。
请注意,示例中的 bmsPos 字段没有问题,因为 proto-2 消息使用与 proto-3 (0) 相同的默认值。但是如果你碰巧选择了一个与 proto-3 不同的默认值,那么我看不到如何升级到 proto-3 并向后兼容。
【问题讨论】:
标签: protocol-buffers