
FlatBuffers 如何用 flatc 完成 JSON 与二进制 buffer 的相互转换【免费下载链接】flatbuffersFlatBuffers: Memory Efficient Serialization Library项目地址: https://gitcode.com/GitHub_Trending/fl/flatbuffersFlatBuffers 的编译器flatc除了生成代码之外还有一个直接可用的功能在 JSON 数据文件和 FlatBuffers 二进制 buffer 之间做相互转换。如果你有.fbsschema 和一份符合该 schema 的 JSON 数据就可以用它把 JSON 序列化成*_wire.bin二进制文件反过来也可以把二进制文件转回 JSON 文本。整个任务只需要一条命令无需在程序里写任何转换代码。本文以仓库自带的 samples/monster.fbs 和 samples/monsterdata.json 为例走通这条路径。准备条件转换需要两样输入schema 文件.fbs定义了字段、类型和root_type。JSON 本身不含对象类型信息解析 JSON 时必须先读 schema 才知道把数据解析成哪种类型见 docs/source/schema.md 中 Root type 一节。数据文件.json文本或已序列化的二进制 buffer。flatc本体需要先获得。docs/source/building.md 给出了两种途径# 从源码构建Unix cmake -G Unix Makefiles -DCMAKE_BUILD_TYPERelease make -j构建完成后产物中包含flatc。文档同时说明也可以从项目的 GitHub release 页面直接下载预编译二进制跳过构建步骤。以仓库自带的示例数据为例schema 是samples/monster.fbs其中声明了root_type Monster;JSON 数据是samples/monsterdata.json包含pos、hp、name、weapons、equipped_type/equipped等字段。JSON 转二进制 buffer按 docs/source/flatc.md 的用法--binary简写-b把 JSON 数据序列化成二进制文件schema 文件必须列在数据文件之前flatc --binary samples/monster.fbs samples/monsterdata.json执行后会在当前目录生成monsterdata_wire.bin即序列化后的 flatbuffer 数据。文档中的示例是flatc --binary myschema.fbs mydata.json示例结果文档说明该命令生成mydata_wire.bin文件。输出文件名由输入 JSON 文件名加_wire后缀、扩展名.bin构成--size-prefixed选项说明输入二进制也可以是带大小前缀的 buffer。docs/source/languages/cpp.md 的 Text schema parsing 一节把这条路称为 Using the compiler as a conversion tool并指出它是文档推荐的转换方式不要求程序新增代码可以直接随程序发布二进制数据。同一节给出的等价简写形式是flatc -b myschema.fbs mydata.json。如果不想输出到当前目录用-o PATH指定输出路径绝对或相对路径均可PATH 需以系统的目录分隔符结尾。二进制 buffer 转回 JSON反向转换用--json简写-j。注意二进制文件要放在--之后与 schema 文件区分开对应 docs/source/flatc.md 用法行中的[ -- BINARY_FILES... ]flatc --json samples/monster.fbs -- monsterdata_wire.bin文档示例中这条命令对mydata.bin会生成mydata.json按同样规则对monsterdata_wire.bin会生成同名的 JSON 文件。生成的 JSON 中字符串会带上前节所述的转义序列如\uXXXX、\xXX这是解析器反向生成 JSON 时的固定行为见 docs/source/schema.md 的 JSON Parsing 一节。一个关键前提schema 里是否定义了file_identifier。file_identifier MYFI;这种声明恰好 4 个字符存放在 buffer 偏移 4-7 处相当于文件头的 magic number。如果 schema 定义了 identifierflatc生成的二进制会自动带上它反向转 JSON 时直接按上面的命令执行即可如果没有定义 identifier则需要追加--raw-binary选项才能读取flatc --json samples/monster.fbs --raw-binary -- monsterdata_wire.bin--raw-binary的文档警告它允许读取没有 identifier 的二进制但遇到 schema 不匹配时flatc可能崩溃。identifier 适合文件这类开放式用途如果只是一组网络消息schema 文档建议改用 union 区分类型。影响转换行为的常用选项以下选项都出自 docs/source/flatc.md按与转换任务直接相关的顺序列出选项作用--strict-json要求并生成严格 JSON字段名带引号、无尾逗号。默认行为是不要求/不生成引号且允许尾逗号--defaults-json写出 JSON 时把值等于默认值的字段也一并输出。配合反向转换使用可以避免默认值字段消失带来的 diff--root-type T选择或覆盖 schema 的默认root_type--size-prefixed声明输入二进制是带大小前缀的 buffer--force-defaults由 JSON 生成二进制时把默认值也写进二进制输出--natural-utf8以人类可读的 UTF-8 字符串输出而不是默认的\uXXXX转义--no-warnings屏蔽所有警告信息-o PATH指定所有生成文件的输出目录--defaults-json需要理解 FlatBuffers 的一个固有行为等于默认值的标量字段不会写入二进制见 docs/source/schema.md 的 Gotchas 一节。因此二进制转回 JSON 后原本等于默认值的字段可能不会出现在输出里——这不是转换出错。想让 JSON 保留这些字段就加--defaults-json想让二进制里就包含默认值则用--force-defaults。写 JSON 输入时要注意的格式规则从 JSON 生成二进制这一方向输入 JSON 必须符合 schema 的强类型解析规则docs/source/schema.md JSON Parsing 一节字段名可带引号也可不带解析器同样识别符号化的 enum 值如field: Blue。union 字段必须写成两个字段先equipped_type: Weapon紧跟equipped本身。samples/monsterdata.json正是这种写法。字段值为null表示取该字段的默认值等价于不写这个字段。支持少量内置函数如rad(180)。验证与限制文档给出的成功判据是输出文件的生成--binary方向生成*_wire.bin--json方向生成对应的.json文件。可以把两个方向串起来做一次往返monster.fbs monsterdata.json生成monsterdata_wire.bin再用--json转回检查字段与输入一致注意默认值字段的行为必要时加--defaults-json。需要注意的边界两个方向都要求 schema 文件在FILES...中位于数据文件之前顺序写反会导致转换无法进行。没有file_identifier的 schema 转 JSON 时必须带--raw-binary且 schema 不匹配时可能崩溃。union 字段不能作为 FlatBuffer 的 rootschema 文档说明 union 一定是 table 的一部分所以root_type指向的必须是普通 table如果 schema 的默认root_type与数据不符用--root-type T覆盖。短选项形式-b/-j仍可用但文档注明生成器相关的短选项已弃用建议尽量使用长选项。【免费下载链接】flatbuffersFlatBuffers: Memory Efficient Serialization Library项目地址: https://gitcode.com/GitHub_Trending/fl/flatbuffers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考