0

我们已决定升级到 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但没有收到任何值。

是否可以强制协议生成始终发送所有字段的代码(即使它们设置了默认值),还是可以通过其他方式解决?

谢谢

4

0 回答 0