原型3中的可选(重复)字段

时间:2019-03-14 19:21:59

标签: protocol-buffers

我使用protobuf和proto 3语法定义消息。

我希望能够在未提供其值(未指定)和使用默认值设置/保留其值(对于int32为0[]重复等)。 对于值,有一个众所周知的包装器可以做到这一点,但对于自定义消息,则是自己包装的。

有些人想出了一种依靠其中一种技术,但不适用于收藏品(重复或地图)。

现在,我开始考虑为每个消息系统地编写包装器。

message MyMessage {
  int32 id = 1;
  string name = 2;
  // ...
  message Optional {
    MyMessage value = 1;
  }
  message OptionalRepeated {
    repeated MyMessage values = 1;
  }    
}

即使可能永远不会使用MyMessage.OptionalRepeatedMyMessage.Optional

我想人们一定已经开始依赖这种模式了,所以也许已经有了可以自动生成此样板代码的工具。 您知道减轻这种负担的工具吗?甚至更好,是否有更好的方法?

2 个答案:

答案 0 :(得分:0)

在许多情况下,最好通过可选字段明确传达您试图隐式传达的含义。

通常它只是一个单独的bool字段。考虑例如:

message UpdateParameters
{
   bool updateServerList = 1;
   repeated ServerType serverList = 2;
}

这使任何人都清楚知道要更新为[]的代码,只需设置updateServerList = trueserverList = []。如果它是类型为optionalServerList的单个字段,则不清楚如果该参数丢失,将会发生什么,另一方面,如果没有多余的注释,则实现另一个的人可能会丢失空和丢失之间的区别协议的侧面。

具有单独的字段还为保留兼容性更新提供了更多可能性。例如,您可以添加Timestamp updateIfOlderThan = 3;,同时仍然保留为仅了解true/false字段的旧客户端单独定义行为的可能性。

答案 1 :(得分:0)