Java中如何处理未知的protobuf字段?

2024-04-20

我有一个 Java 应用程序,它从另一台计算机读取一些 protobuf 数据,然后修改一些值并将其写回。用户很可能使用过时的 .proto 文件读取数据,因此在这种情况下会有一些字段无法理解。我最终希望在写回所做的更改时保留未知的数据;但是,我可以满足于仅检测到存在未知数据(以提示用户升级他/她的应用程序)。我不清楚如何处理 Java 中的未知字段。

如果有帮助,我正在使用版本 2 .proto 文件,因为我需要它与远程计算机上的 nanopb 兼容。

This question https://stackoverflow.com/questions/41131076/protobuf-getallfields-not-working-as-expected让我明白了,但我的问题与 JSON 无关。


首先请注意当你说未知字段时。在 protobuf 中,根据定义,您可以拥有未知字段,但另一方面 - 我想这就是您的情况 - 您可以拥有当前原型文件中没有的字段。

在这两种情况下,您都可以轻松访问这些值。假设您有一条名为的原始消息foo.

您必须访问描述符并按名称从那里获取字段,最后获取如下所示的值:

Builder builder = foo.toBuilder();
FieldDescriptor field = builder.getDescriptorForType().findFieldByName("whatever field");
Object obj = builder.getField(field);

// if your field is int32 cast to int
int value = (int) obj

如果您想写入“未知”值,您可以以相反的方式进行:

Builder builder = foo.toBuilder();
FieldDescriptor field = builder.getDescriptorForType().findFieldByName("whatever field");
builder.setField(field, 100); // 100 is an example int value
Foo foo = builder.build();

如果您确实想插入原始定义的未知字段,您必须执行以下操作:

 UnknownFieldSet.Field seqField = UnknownFieldSet.Field
            .newBuilder()
            .addFixed32(100) // 100 is an example int value
            .build();

 UnknownFieldSet unkFieldSet = UnknownFieldSet
            .newBuilder()
            .addField(99, seqField) // 99 is a proto index number chosen by me
            .build();

 Foo message = foo.toBuilder().setUnknownFields(unkFieldSet).build();

再次读取定义的未知字段是通过以下方式完成的:

 foo.toBuilder().getUnknownFields()....

我希望这有帮助。

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

Java中如何处理未知的protobuf字段? 的相关文章

随机推荐

  • 来自 Microsoft Graph 的多个更改通知

    每当更新 创建 删除或编辑 事件时 我都尝试从 Microsoft Graph 接收更改通知 我已成功创建订阅 接收通知的 URL 属于 Azure Function 但是 每当我创建或删除事件时 图表都会针对一个特定更改发送多个通知 正如
  • Cocoa 结构体和 NSMutableArray

    我有一个 NSMutableArray 我正在尝试存储和访问一些结构 我该怎么做呢 addObject 给我一个错误 说 addObject 的参数 1 的类型不兼容 这是一个示例 in 是 NSFileHandle array 是 NSM
  • 在 Windows 8/10 上调用静态链接函数每次都会崩溃,但在 Windows 7 上则不然

    问题 我已经建立了https github com reorg pg repack https github com reorg pg repack生成二进制文件的项目 该二进制文件与 postgres 9 6 可再发行组件链接 我使用由
  • 使用 @EmbeddedKafka 时执行 @DirtiesConfig 的正确方法是什么

    我们的项目中有一个 小 问题 无法建立与节点 0 的连接 代理可能不可用 测试运行非常非常长的时间 并且该消息每秒至少记录一次 但我发现 如何摆脱它 请继续阅读 如果配置 注释有不正确的地方 请告诉我 版本优先
  • EXC_BAD_ACCESS 使用 gmaps sdk 1.9.0,Xcode 6.4,在 8.3 设备上运行

    我有 2 个使用 google 地图 sdk 的项目 它们目前位于 Appstore 中 需要注意的事项 通过cocoapods安装的Gmaps sdk版本1 9 0 Xcode 版本 6 4 部署目标 7 1 设备 iPhone 4s 8
  • 将变量从中间件传递到模板

    我是 Django 初学者 到目前为止我学到了传递变量view to template 但现在我需要将变量传递到我的主布局 我可以在视图中的每个页面的定义中传递它 但它的重复太多了 于是我开始学习中间件 我创建了 middlewares p
  • VBA 打开多个工作簿、复制特定数据、删除重复行并将信息粘贴到新工作簿中

    我知道标题不太清楚 但我希望我能在这个描述中更好地解释它 我是 VBA 新手 我需要编写一些执行以下操作的代码 打开特定文件夹中的多个工作簿 并将信息从源工作表 仅一个活动工作表 中间的表复制到新工作簿中的目标 Sheet1 问题 1 表的
  • 有没有办法让 xsd.exe 生成具有“内部”范围的类?

    我有一个 DLL 其中包含一些 XSD 生成的类 不幸的是 XSD exe 将这些类公开 这会导致 缺少公开可见类型或成员 XYZ 的 XML 注释 警告 另外 我不想从我的 DLL 中公开这些类 有没有办法 除了手动编辑生成的 cs 之外
  • 如何通过T-SQL在SQL Server 2008中创建计划作业?

    我想创建一个作业 在一段时间过去后从数据库中删除记录 例如我在新闻表中有一个字段Time Stamp每个月都会有一个 SQL 查询像计划作业一样针对我的数据库运行 并删除时间戳为两个月前的新闻 一般来说 我想删除两个月前或更早的新闻 以免我
  • 克隆与实例化新类

    在这种情况下 克隆是好的做法吗 怎样才能做得更好呢 public ModelCollection startParsing return parseFeed new ModelSpecialEntry public ModelCollect
  • 数据库模式混乱

    当我设计一些类时 我遇到了轻微的术语混乱 在 Sql Server 2005 中 架构 指的是数据库对象的命名空间和组织系统 但对于一般的关系数据库来说 模式 意味着表 字段等的 DDL 设计 如果我的观点是正确的 那么它解释了当我尝试阅读
  • 哪个STL容器?

    我需要一个容器 不一定是 STL 容器 它可以让我轻松执行以下操作 在任意位置插入和移除元素 通过索引访问元素 以任意顺序迭代元素 I used 标准 列表 但它不会让我在任何位置插入 确实如此 但为此我必须迭代所有元素 然后在我想要的位置
  • 将日期从 MySQL 正确导入到 R 中

    我的问题几乎相同正如这个 https stackoverflow com questions 27597932 databse connection using dplyr with date field in databse 简而言之 我
  • 在 NULL 表示为 0 的平台上,编译器是否曾经生成过 NULL <= p 的意外代码

    在 C99 中 平等 似乎从来没有未定义过 它可以产生1如果您意外地将其应用到无效地址 例如 x 1 y可能是偶然的事实 它不会产生未定义的行为 许多 但不是全部 无效地址未定义为根据标准计算 使用 因此p x with p悬空指针 或者
  • CSS 中的“缩放”有什么作用?

    我发现一些 jQuery 插件在他们的 css 规则中使用了 zoom 描述符 我什至查看了 w3c 网站 发现它是用来放大的 但我该如何实际实现它呢 或者我必须定义一些视口 我如何定义这样的视口 或者我对整个事情都错了 是否可以像这样使用
  • Blowfish 在 Java/Scala 中加密并在 bash 中解密

    我正在尝试构建一个工具来解密在 scala 应用程序中加密的 bash 内容 但首先 我必须成功地用两种语言对相同的消息进行编码并使它们相等 给定密码 0123456789abcdef 十六进制 3031323334353637383961
  • 为什么具有单个组的数据帧 groupby 不返回数据帧?

    我怀疑这是我的问题的更简单形式here https stackoverflow com questions 18518077 why does pandas groupby cut give different form of output
  • std::variant 似乎不适用于 C++ 中的shared_ptr

    通过下面的代码 我得到 In static member function static std shared ptr
  • C++20 内存模型中释放序列定义的更改有何影响?

    考虑这个程序 Initially std atomic
  • Java中如何处理未知的protobuf字段?

    我有一个 Java 应用程序 它从另一台计算机读取一些 protobuf 数据 然后修改一些值并将其写回 用户很可能使用过时的 proto 文件读取数据 因此在这种情况下会有一些字段无法理解 我最终希望在写回所做的更改时保留未知的数据 但是