我们已决定升级到proto3,但仍然必须能够与运行proto2的设备通信一段时间。
现在,我们遇到了一些消息问题,由于required
关键字,它们无法在proto2一侧反序列化。
这是我们对(proto2)有疑问的一条消息。
message time_value
{
required uint32 hour = 1;
required uint32 minutes = 2;
required uint32 microseconds = 3;
}
如果我们尝试将此消息发送给proto2客户端,并且设置了以下值,例如小时= 1,分钟= 2,微秒= 0,则客户端无法反序列化此消息。设置微秒= 1,则proto2客户端在读取消息时没有问题。
这可以归结为以下生成的C#代码
public void WriteTo(pb::CodedOutputStream output) {
...
if (Microseconds != 0) {
output.WriteRawTag(48);
output.WriteUInt32(1);
}
...
}
因此,如果字段具有与数据类型的默认值相同的值,则似乎生成的proto3代码不会发送任何字段。当然,这确实会使proto2感到不安,并且也不想对消息进行反序列化,因为该字段被标记为required
,但未收到任何值。
是否可以强制协议生成始终发送所有字段的代码(即使已设置默认值)还是可以通过其他方式解决?
谢谢