如何设计协议缓冲区中未来的附加枚举值?

2024-01-05

Protocol buffers 的吸引人的功能之一是它允许您扩展消息定义,而不会破坏使用旧定义的代码。对于枚举的情况根据文档 https://developers.google.com/protocol-buffers/docs/proto#enum:

具有枚举类型的字段只能将一组指定的常量之一作为其值(如果您尝试提供不同的值,解析器会将其视为未知字段)

因此,如果您扩展枚举并使用新值,那么旧代码中具有该类型的字段将是未定义的或具有其默认值(如果有)。

知道将来枚举可能会增加额外的值,处理这个问题的好策略是什么?

我想到的一种方法是定义枚举的“未定义”成员并将其设为默认成员,然后旧代码就会知道它已发送了无法解释的内容。这是明智的吗?有更好的方法来处理这种情况吗?


是的,最好的方法是使枚举中的第一个值类似于UNKNOWN = 0。然后旧程序读取具有它们无法识别的枚举值的 protobuf 时会将其视为UNKNOWN希望他们能够合理地处理这个问题,例如跳过该元素。

如果您想这样做,您还需要使枚举成为optional not required.

required一般来说,意味着“我宁愿程序中止也不愿处理它不理解的东西。”

请注意,它必须是原始源中声明的第一个值- 仅为零值并不使其成为默认值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何设计协议缓冲区中未来的附加枚举值? 的相关文章

随机推荐

  • Visual C++ TODO 任务列表不显示元素

    即使激活配置中的选项 TODO 注释和其他自定义定义也不会显示在 Visual Studio 2010 Ultimate x64 sp1 的任务列表中 正如该文章中所述 Visual Studio TODO 任务列表未显示 https st
  • onPostExecute() 中的 ArrayList 空指针异常

    Getting NullPointerException在数组列表中 我使用下面的行来记录 ArrayList 的大小 但我总是得到 NPE 可能是什么原因 Log d catArrayList Size New categoryArray
  • 仅比较对象左侧或右侧

    快速提问 有没有更好的 即更有效 更简洁 的方法来做到这一点 compare object a b SideIndicator eq lt Detail Compare Object给定参数 excludeDifferent and inc
  • 从文档正文中插入元标记?

    我需要添加一个元标记 具体来说 到某个页面 但是我们模板的设置方式 我不可能直接编辑 HEAD 标签的代码 出于公司原因 而不是技术原因 因此 有没有办法在 BODY 标签中使用 JQuery 来添加此元标签 也许你可以尝试这个 jQuer
  • 为什么 TreeViewItem 的 MouseDoubleClick 事件每次双击都会引发多次?

    XAML
  • 在 Web 项目之外使用 Razor

    我想使用 Razor 视图引擎生成电子邮件 根据我所读到的内容 我可以使用这些操作系统项目从我的网站上做到这一点 Postal http aboutcode net postal ActionMailer Net http geekshar
  • 为什么定义静态成员变量时不遵循定义顺序?

    我知道来自不同翻译单元的静态变量的初始化顺序问题 然而 我的问题是在一个翻译单元内 实际上是在一个结构内 template
  • HttpClient 超时和 Polly Bulkhead 策略问题

    我使用 Polly Bulkhead 策略遇到了许多超时异常 该策略帮助我限制发送到特定主机的并发调用的数量 然而 HttpClient 超时时间似乎会影响整个委托 我使用 IHttpClientFactory 通过以下代码进行配置 ser
  • JWT(JSON Web Token)自动延长过期时间

    我想对我们的新 REST API 实施基于 JWT 的身份验证 但是既然token里设置了过期时间 那么是否可以自动延长呢 如果用户在这段时间内积极使用该应用程序 我不希望他们需要在每 X 分钟后登录一次 这将是一个巨大的用户体验失败 但是
  • Haskell 中的单例类型

    作为对各种依赖类型形式化技术进行调查的一部分 我遇到了一篇论文 提倡使用单例类型 只有一个居民的类型 作为支持依赖类型编程的一种方式 根据此消息来源 在 Haskell 中 运行时值和编译时类型之间存在分离 由于引入的类型 值同构 在使用单
  • VS Code:如何将代码片段占位符转换为大写或小写?

    在 VS Code 中 用于创建的文档用户定义的片段 https code visualstudio com docs editor userdefinedsnippets提到一些Grammar https code visualstudi
  • R:如果加载插入符号包,set.seed() 结果不匹配

    我在用createFolds 在 R 版本 3 3 0 中创建训练 测试分区 为了使结果可重复 我使用了set seed 种子值为 10 正如预期的那样 结果 生成的折叠 是可重复的 但是一旦我在设置种子后加载插入符号包 然后使用creat
  • 将对象实例写入 C# 的工具(用于单元测试)

    假设我有一个接受对象列表的方法 该方法通常可以轻松处理 20 个对象 每个对象都有大约 15 个属性 为了对此进行单元测试 我需要输入所有 20 个对象 以便可以将它们传递到我的方法中 当我可以在调试器监视窗口中看到我需要的完美示例时 这真
  • 加载共享库时出错,无法打开共享对象文件:没有这样的文件或目录(hiredis)

    我正处于编写一个在后端使用 redis 的 C 程序的 alpha 阶段 我尝试过构建 安装hiredis make sudo make install 并运行测试 大部分通过 但是当尝试构建示例 c https github com re
  • Laravel 护照范围

    我对 laravel 范围部分有点困惑 我有一个用户模型和表 如何为用户分配用户 客户和 或管理员的角色 我有一个带有 vue 和 laravel api 后端的 SPA 我用https laravel com docs 5 3 passp
  • Android 版 Canvas 中的撤消和重做

    我正在使用定制版本指甲油 http developer android com resources samples ApiDemos src com example android apis graphics FingerPaint htm
  • 如何在 ASP.net core 中按请求缓存

    我的旧代码如下所示 public static class DbHelper One conection per request public static Database CurrentDb if HttpContext Current
  • JavaScript 中的变量有多昂贵?

    局部变量有多昂贵 var v 全局变量 window v 和跨全局变量 parent v 在 JavaScript 中 在主要浏览器中 有人对此进行过良好的测试吗 忽略解释器 解析器的优缺点 重要的是运行时必须查看作用域链的各个部分的程度
  • 带钩子的应用程序加载启动画面

    在使用带钩子的功能组件时 如何实现加载资源的同时显示闪屏 使用带有钩子的应用程序加载和 或启动屏幕的模式是什么 Thanks Bill 如果你只明白Hook s useState 这是一个非常容易的改变 这可以简单地转换为函数 并使用以下方
  • 如何设计协议缓冲区中未来的附加枚举值?

    Protocol buffers 的吸引人的功能之一是它允许您扩展消息定义 而不会破坏使用旧定义的代码 对于枚举的情况根据文档 https developers google com protocol buffers docs proto