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

更新proto的定义后,旧proto文件会发生什么变化?

柳项明
2023-03-14

假设有一天我将一条原始消息保存在一个文件中,作为my_文件。pb第二天,我在消息中添加了一个新字段。

然后我读了我的_文件。从磁盘读取pb并尝试访问新字段。这会崩溃吗?这是UB吗?它是按标准处理的吗?

我试着读留档,我能得到的只有:

你可以在不破坏向后兼容性的情况下向消息格式中添加新字段;解析时,旧的二进制文件会忽略新字段。因此,如果您有一个使用协议缓冲区作为数据格式的通信协议,那么您可以扩展协议,而不必担心破坏现有代码。

这并没有告诉我,如果我的代码试图访问存储的proto中最初未定义的字段,会出现什么行为。

共有1个答案

公羊喜
2023-03-14

如果你使用的是prop3:没问题,所有字段都是可选的。它只是空/零。

如果你使用的是proto2:这取决于;“可选”或“重复”——很好,没问题——它只是空/默认值。“必选”:砰,你完蛋了。所以别那么做?

 类似资料:
  • 我有这样一个gRPC API定义(来自Akka docs示例),但要长得多(4000行,仅是服务部分)。 然而,RPC列表现在变得太长了,我想以某种方式将其“分解”为多个文件,以便文件更具可读性。像这样的 即使只是在不同的文件中分别定义RPC,然后编写类似的内容也会对我有所帮助: 是否有可能在gRPC协议定义中以某种方式“组合”服务?

  • 我的原始文件使用默认的谷歌协议缓冲区类型,如结构和时间戳。 使用默认的gradle协议集成,gradle输出错误,因为它无法解决导入: google/protobuf/struct。proto:找不到文件。 google/protobuf/timestamp。proto:找不到文件。 替换默认的gradle协议块 其中一个指定protoc的位置 修复了该问题,但它不可移植。 是否有任何jar依赖项

  • 我正在使用由Visual Studio生成的gRPC服务项目。我有两个原型文件位于同一个“原型”目录中。我有一个原型,另一个原型文件有导入。它似乎找到了文件,但我无法引用来自另一个文件的任何消息。当我这样做时,我得到一个“blahblah”是未定义的错误。我已经拍摄了一些情况的屏幕截图。任何帮助都将不胜感激!

  • 我使用maven插件“org.xolstice.maven.plugins”创建了原型生成的java文件jar文件。它包含所需的所有java文件,并导入到具有maven依赖关系的项目中。无编译问题。执行时,我得到未实现的异常。 但是我不希望这是作为java源代码内的项目.因为生成的源代码有非常巨大的java文件编译它需要很长的时间每次我构建,所以我需要它作为一个jar文件。

  • 我一直在尝试运行以下命令 获取以下错误 github。com/x/customValidation/validators。proto:找不到文件。test\u服务器/测试。proto:5:1:Import“github.com/x/customValidation/validators.proto”未找到或有错误。 我可以看到原始文件在这个位置- 我还尝试了使用--proto\u path命令,但

  • ProtoAct 是下一代的 Actor 模型框架,提供了 .NET 和 Go 语言的实现,默认支持分布式,提供管理和监控功能。在过去几年,我们经常看到两种 Actor 模型方法相互竞争,首先是经典的 Erlang/Akka 风格的 Actor 模型;以及微软的“虚拟Actor”或者成为“Grains” 的风格。这两种风格有各自的优缺点。 而 Proto.Actor 将这两种风格结合在一起形成一个