Flatbuffer:运行时和编译器的兼容性
Flatbuffer: Compatibility of runtime and compiler
Flatbuffers 是否兼容不同版本的 Flatbuffer 编译器 + 运行时库?
我花了很多时间解决这个问题,我认为我已经确定答案是 "NO",但仍然没有找到权威的答案。文档对此一无所知。
例如:
- 使用来自 v1.11
的 flatc
生成代码 (Java/Go)
- 使用生成的代码在另一个使用来自 v1.10 的运行时依赖项的应用程序上写入和读取(读取在技术上只是因为本地单元测试)。
如果是这种情况,那么我很乐意对 compiler/runtime 升级故事进行一些澄清。也许我的问题是我写的版本比我读的版本高 - 因此,升级故事可能是始终先升级读取器,然后推出写入器升级。
FlatBuffers(实际的二进制序列化缓冲区/文件)在设计上是向前和向后兼容所有语言、平台和版本的。因此,您可以升级以任何顺序读取或写入这些缓冲区的代码,而不会 运行 出现格式兼容性问题。
然而,由特定版本的 flatc
为特定语言生成的代码必须针对完全相同版本的运行时进行编译。生成的代码和运行时与 FlatBuffers 这样的低级系统紧密相关,因此无法确保两者之间的 API 在所有版本中保持稳定。这纯粹是一个代码编译问题,但是,不应影响序列化数据。
你不应该将两者分离。如果您发布的代码依赖于生成的代码,则需要确保项目也包含匹配的运行时,而不是依赖于可能已经存在于用户系统或其他系统上的外部运行时。
Java 最近进行了更改以确保人们不会出现运行时不匹配的情况,尽管 1.10 中不存在这种情况。
Flatbuffers 是否兼容不同版本的 Flatbuffer 编译器 + 运行时库?
我花了很多时间解决这个问题,我认为我已经确定答案是 "NO",但仍然没有找到权威的答案。文档对此一无所知。
例如:
- 使用来自 v1.11 的
- 使用生成的代码在另一个使用来自 v1.10 的运行时依赖项的应用程序上写入和读取(读取在技术上只是因为本地单元测试)。
flatc
生成代码 (Java/Go)
如果是这种情况,那么我很乐意对 compiler/runtime 升级故事进行一些澄清。也许我的问题是我写的版本比我读的版本高 - 因此,升级故事可能是始终先升级读取器,然后推出写入器升级。
FlatBuffers(实际的二进制序列化缓冲区/文件)在设计上是向前和向后兼容所有语言、平台和版本的。因此,您可以升级以任何顺序读取或写入这些缓冲区的代码,而不会 运行 出现格式兼容性问题。
然而,由特定版本的 flatc
为特定语言生成的代码必须针对完全相同版本的运行时进行编译。生成的代码和运行时与 FlatBuffers 这样的低级系统紧密相关,因此无法确保两者之间的 API 在所有版本中保持稳定。这纯粹是一个代码编译问题,但是,不应影响序列化数据。
你不应该将两者分离。如果您发布的代码依赖于生成的代码,则需要确保项目也包含匹配的运行时,而不是依赖于可能已经存在于用户系统或其他系统上的外部运行时。
Java 最近进行了更改以确保人们不会出现运行时不匹配的情况,尽管 1.10 中不存在这种情况。