八.Protobuf3更新消息类型(添加新的字段)

Protobuf3 更新消息类型

如果现有的消息类型不满足你的所有需求——例如,你希望消息格式有一个额外的字段——但是你仍然希望使用用旧格式创建的代码,别担心!在不破坏任何现有代码的情况下更新消息类型非常简单。请记住以下规则:

不要更改任何现有字段的字段编号。

如果添加新字段,任何使用“旧”消息格式由代码序列化的消息仍然可以被新生成的代码解析。您应该记住这些元素的默认值,以便新代码可以与旧代码生成的消息能够正确交互。同样,新代码创建的消息可以被旧代码解析:旧二进制文件在解析时忽略新字段。

未知字段是格式良好的协议缓冲区序列化数据,用于表示解析器无法识别的字段。例如,当旧二进制解析新二进制发送的带有新字段的数据时,这些新字段将成为旧二进制中未知的字段。

最初,proto3消息在解析过程中总是丢弃未知字段,但是在3.5版中,我们重新引入了未知字段的保留以匹配proto2行为。在3.5及更高版本中,未知字段会在解析期间保留,并包含在序列化输出中。

只要更新的消息类型中不再使用字段号,就可以删除字段。您可能希望重命名该字段,也许添加前缀 "OBSOLETE_",或者保留字段号,以便将来你.proto不会意外地被其他用户重复使用。

int32, uint32, int64, uint64和bool都是兼容的——这意味着您可以将字段从这些类型中的一种更改为另一种类型,而不破坏向前或向后兼容性。如果从不适合相应类型中的字段中解析出一个数字,你将会得到与用c++将该数字转换为该类型相同的效果(例如,如果int64数字被解析为int32,它将被截断为32位)。

sint32 和sint64 彼此兼容,但与其他整数类型不兼容。只要字节是有效的UTF - 8,字符串和字节是兼容的。

如果字节包含消息的编码版本,则嵌入消息与字节兼容。

fixed32与sfixed32兼容, fixed64与sfixed64兼容。

enum与int32、uint32、int64和uint64在电线格式条款兼容(请注意,如果这些值不匹配,它们将被截断)。然而,请注意,当消息被反序列化时,客户端代码可能会以不同的方式对待它们:例如,无法识别的proto3枚举类型将保留在消息中,但是当消息被反序列化时,这是如何表示的取决于语言,int字段总是保留其值。

将单个值更改为新值的成员是安全的,并且是二进制兼容的。如果您确定没有代码一次设置多个字段,将多个字段移动到新的字段可能是安全的,将任何字段移动到现有字段中是不安全的。

上一篇:十一.Protobuf3可选项


下一篇:【转】提高PHP性能的53个技巧