文章目录
ProtoBuf
5. proto3语法详解
5.8 更新消息
在 Protobuf(Protocol Buffers),更新消息通常是指对已定义的消息类型进行修改或扩展。Protobuf 具有良好的向前和向后兼容性。
如果现有的消息类型已经不再满足我们的需求,例如需要扩展一个字段,在不破坏任何现有代码的情况下更新消息类型必须遵循如下规则。
5.8.1 更新规则
规则 1:禁止修改任何已有字段的字段编号。
示例:假设有个 Person 消息类型,其中 name 字段的编号是 1,就不能将其改为其他数字。
message Person {
string name = 1;
}
规则 2:int32,uint32,int64,uint64 和 bool 是完全兼容的。可以从这些类型中的一个改为另一个,而不破坏前后兼容性。 若解析出来的数值与相应的类型不匹配,会采用与 C++ 一致的处理方案(例如,若将 64 位整数当做 32 位进行读取,它将被截断为 32 位)。
示例:原本是 int32 的 score 字段可以改为 int64 。
message Game {
int64 score = 1; // 之前可能是 int32
}
规则 3:sint32 和 sint64 相互兼容但不与其他的整型兼容。
示例:sint32 的 count 可以改为 sint64 。
message Data {
sint64 count = 1; // 之前是 sint32
}
规则 4:string 和 bytes 在合法 UTF-8 字节前提下也是兼容的。
示例:description 字段可以在 string 和 bytes 类型间切换。
message Info {
bytes description = 1; // 之前可能是 string
}
规则 5:bytes 包含消息编码版本的情况下,嵌套消息与 bytes 也是兼容的。
示例:假设有个嵌套的 Version 消息,version_info 字段可以是 bytes 类型。
message Version {
int32 major = 1;
int32 minor = <