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