Flatbuffer:运行时和编译器的兼容性

时间:2019-10-08 16:49:07

标签: flatbuffers

Flatbuffers是否在不同版本的Flatbuffer编译器+运行时库之间兼容?

我花了很多时间解决这个问题,并认为我已经确定答案是“否”,但是仍然找不到权威的答案。文档对此毫无帮助。

例如:

  • 使用<{> v1.11
  • 中的flatc生成代码(Java / Go)
  • 使用生成的代码在使用 v1.10 中的运行时依赖项的另一个应用程序上进行写入和读取(从技术上来说,此读取仅是由于本地单元测试而引起)。

如果是这种情况,那么我很想澄清一下编译器/运行时升级的故事。也许我的问题是,我写作的版本高于我阅读的版本,因此,升级的故事可能始终是首先升级读者,然后推出作家升级。

1 个答案:

答案 0 :(得分:0)

FlatBuffers(实际的二进制,序列化的缓冲区/文件)通过设计可以在所有语言,平台和版本之间向前和向后兼容。因此,您可以升级以任何顺序读取或写入这些缓冲区的代码,而不会遇到格式兼容性问题。

但是,flatc的特定版本针对特定语言生成的代码必须针对完全相同版本的运行时进行编译。对于像FlatBuffers这样的低级系统,生成的代码和运行时紧密相关,因此无法确保两者之间的API在所有版本中均保持稳定。这纯粹是一个代码编译问题,但是,不应影响序列化的数据。

您不应该将两者分离。如果要交付的代码依赖于生成的代码,则需要确保项目也包含匹配的运行时,而不是依赖于用户系统上可能已经存在的外部运行时或任何其他方式。

Java最近进行了更改,以确保人们不会错配运行时,尽管1.10中没有。