我使用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可能永远不会被使用。
我猜人们肯定已经开始依赖这种模式了,所以可能已经有一个工具可以自动生成这种样板代码了。你知道有什么工具可以减轻这个负担吗?或者更好的是,有更好的方法吗?
发布于 2019-03-17 02:52:12
在许多情况下,显式地传达您试图通过可选字段隐式传达的含义可能更好。
通常它可以只是一个单独的bool字段。请考虑以下示例:
message UpdateParameters
{
bool updateServerList = 1;
repeated ServerType serverList = 2;
}这使阅读代码的人清楚地知道,如果您想更新到[],只需设置updateServerList = true和serverList = []即可。如果它只是一个optionalServerList类型的字段,那么如果参数只是丢失了,那么会发生什么就不那么清楚了,另一方面,如果没有额外的注释,空和丢失之间的区别可能会在实现协议的另一端丢失。
拥有一个单独的字段也为保持兼容性的更新提供了更多的可能性。例如,您可以添加Timestamp updateIfOlderThan = 3;,同时仍然保留为只知道true/false字段的旧客户端单独定义行为的可能性。
发布于 2021-03-10 23:49:26
https://stackoverflow.com/questions/55170484
复制相似问题