当前位置: 首页 > 知识库问答 >
问题:

我可以注销所需的protobuf字段吗?

林烨烨
2023-03-14

我有一个客户机-服务器应用程序,其中服务器以protobuf格式将序列化对象传输给客户机,我想注销一个必填字段。不幸的是,我无法同时更改客户端和服务器以使用新的。proto定义。

如果我将“必需”字段更改为“可选”,但仅针对序列化消息的代码(即,反序列化代码尚未重建,仍然认为它是“必需”字段),只要为“可选”字段填充一个值,我是否可以继续发布可以反序列化的消息?

(这样做似乎很好,至少对于我试验的一些琐碎案例(仅使用Java),但我感兴趣的是这是否是一种普遍合理的方法,以及是否有任何边缘案例等我应该担心)。

动机:我的目标是在客户机-服务器应用程序中注销一个必填字段,服务器在该字段中发布客户机反序列化的消息。我的预期方法是:

  1. 将行李箱上的“必需”字段更改为“可选”
  2. 如果有必要部署新的服务器代码(对于不相关的功能/修复),请确保消息中继续填充可选字段
  3. 逐步为所有客户机部署更新的代码(这需要时间,因为需要其他团队参与他们自己的发布计划)
  4. 确认所有客户端都已更新
  5. 开始注销(即不填充)可选字段

共有2个答案

商高谊
2023-03-14

只要设置了字段,使用parseFrom(byte[])方法进行反序列化仍然有效,因为byte[]是相同的。

然而,人们可能会想,为什么要将字段从required更改为optional,直到您准备允许它成为optional?基本上,您只是在中将其设置为“可选”。proto文件,但您通过始终填充它来强制要求它。只是一个想法。

董高朗
2023-03-14

根据编码格式文档,字段是否必需并不在序列化字节流本身中编码。也就是说,可选必需对编码的序列化消息没有影响。

我已经在实践中证实了这一点,通过使用Java生成的代码,将序列化消息写入磁盘并比较输出-使用包含所有支持的基本类型以及表示其他类型的字段的消息。

 类似资料:
  • 问题内容: 可用于添加特定字符的前缀。 我可以这样做,例如: 它的长度为32,并用0左填充: sendID 相似时如何实现相同的目的: 我想要这样的输出: 问题答案: 您可以使用这种怪异的方式来获取输出: 演示:http://ideone.com/UNVjqS

  • 对于身份验证,目前我们使用JWT,因此一旦创建了令牌,它就会在整个生命周期内创建,如果我们设置了时间过期,令牌将过期。 有没有办法使令牌过期? 单击注销按钮时,我需要销毁令牌。 我正在使用ASP. NET Core WebAPI。

  • 我在我的. proto文件中定义了一个消息消息。它有两个字段,一个必填字段和一个可选字段。 生成Java代码有其关联的,我有它的两个对象 我的问题是: 当我执行oMessage1=oMessage2时,oMessage1的optionalField的值会发生什么变化? 它会消失吗?(因为oMessage2没有)或 它是否保持不变?(因为oMessage1拥有它,所以赋值运算符注意不要用不存在的字段

  • 我是Spring Reactive Web的新手,我遇到了以下问题。我想创建一个微服务A,它的endpoint接受一个数字N,向微服务B发送N个请求(微服务B为每个请求返回一个字符串),将字符串包装成对象,将它们组合成一个List/Flux(?)并返回带有这些对象的JSON,比如: 我想为此使用一个功能endpoint。所以我尝试了以下方法(尽量简化): 所以,如果我在我的响应中使用Flux,我会

  • google protobuf允许我编写如下原型代码: 它可以编译,没问题。我不太明白,对于“可选”字段,当没有指定值时,解码流返回给我默认值,没关系。但是“必需”字段呢,它不能是空的,那么它的“默认”是如何有效的呢?在什么情况下?

  • 我正在使用jQuery FormBuilder插件。链接:http://formbuilder.readthedocs.io/en/latest/.现在,当用户提交表单时,我想确保所有必需的字段(带*)都已填写完毕,否则表单将无法提交(我会收到一条错误消息'一个无效的表单控件,名称='xxx'是不可聚焦的。')。表单中有许多类型的输入,包括文本、文本区域、下拉选择、单选和复选框等。我如何验证所有这