小编Joh*_*ron的帖子

将protobuf从版本2升级到3 - 与protobuf默认值不兼容

我试图升级到使用protobuf版本3,并保持向后兼容版本2.似乎工作除了一件事 - 在proto-2你可以设置自己的默认值,但在原型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];  
}
Run Code Online (Sandbox Code Playgroud)

现在在proto-3必须是:

message Record {
  uint32 fileno = 1;               
  uint64 pos = 2;                  
  uint64 bmsPos = 3; 
  uint32 scanMode = 4;  
}
Run Code Online (Sandbox Code Playgroud)

在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

36
推荐指数
1
解决办法
2万
查看次数

标签 统计

protocol-buffers ×1