我使用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.OptionalRepeated
或MyMessage.Optional
。
我想人们一定已经开始依赖这种模式了,所以也许已经有了可以自动生成此样板代码的工具。 您知道减轻这种负担的工具吗?甚至更好,是否有更好的方法?
答案 0 :(得分:0)
在许多情况下,最好通过可选字段明确传达您试图隐式传达的含义。
通常它只是一个单独的bool
字段。考虑例如:
message UpdateParameters
{
bool updateServerList = 1;
repeated ServerType serverList = 2;
}
这使任何人都清楚知道要更新为[]
的代码,只需设置updateServerList = true
和serverList = []
。如果它是类型为optionalServerList
的单个字段,则不清楚如果该参数丢失,将会发生什么,另一方面,如果没有多余的注释,则实现另一个的人可能会丢失空和丢失之间的区别协议的侧面。
具有单独的字段还为保留兼容性更新提供了更多可能性。例如,您可以添加Timestamp updateIfOlderThan = 3;
,同时仍然保留为仅了解true/false
字段的旧客户端单独定义行为的可能性。
答案 1 :(得分:0)