首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >proto 3中的可选(重复)字段

proto 3中的可选(重复)字段
EN

Stack Overflow用户
提问于 2019-03-15 03:21:59
回答 2查看 2K关注 0票数 3

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

我希望能够区分字段的值何时未提供(未指定),以及何时设置/保留默认值( int32为0,重复为[]等)。对于值,有众所周知的包装器,它允许这样做,但对于自定义消息,则由用户自己决定。

有些人想出了一种依赖于其中之一的技术,但它不适用于集合(重复或映射)。

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

代码语言:javascript
运行
复制
message MyMessage {
  int32 id = 1;
  string name = 2;
  // ...
  message Optional {
    MyMessage value = 1;
  }
  message OptionalRepeated {
    repeated MyMessage values = 1;
  }    
}

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

我猜人们肯定已经开始依赖这种模式了,所以可能已经有一个工具可以自动生成这种样板代码了。你知道有什么工具可以减轻这个负担吗?或者更好的是,有更好的方法吗?

EN

回答 2

Stack Overflow用户

发布于 2019-03-17 02:52:12

在许多情况下,显式地传达您试图通过可选字段隐式传达的含义可能更好。

通常它可以只是一个单独的bool字段。请考虑以下示例:

代码语言:javascript
运行
复制
message UpdateParameters
{
   bool updateServerList = 1;
   repeated ServerType serverList = 2;
}

这使阅读代码的人清楚地知道,如果您想更新到[],只需设置updateServerList = trueserverList = []即可。如果它只是一个optionalServerList类型的字段,那么如果参数只是丢失了,那么会发生什么就不那么清楚了,另一方面,如果没有额外的注释,空和丢失之间的区别可能会在实现协议的另一端丢失。

拥有一个单独的字段也为保持兼容性的更新提供了更多的可能性。例如,您可以添加Timestamp updateIfOlderThan = 3;,同时仍然保留为只知道true/false字段的旧客户端单独定义行为的可能性。

票数 0
EN

Stack Overflow用户

发布于 2021-03-10 23:49:26

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55170484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档