ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

FlatBuffers 如何用 flatc --proto 将 .proto 转换为 .fbs?

FlatBuffers 如何用 flatc --proto 将 .proto 转换为 .fbs? FlatBuffers 如何用 flatc --proto 将 .proto 转换为 .fbs【免费下载链接】flatbuffersFlatBuffers: Memory Efficient Serialization Library项目地址: https://gitcode.com/GitHub_Trending/fl/flatbuffers如果你手里已经有一套 Protocol Buffers 的.proto模式文件想改用 FlatBuffers 但不想手重新描述结构flatc 提供了--proto选项以.proto文件为输入直接输出对应的.fbs文件。下面以仓库自带的示例 test.proto 为例走一遍转换命令、关键选项和结果核对方式。准备条件已构建出可用的flatc可执行文件。构建方法见构建文档命令行参数说明见 flatc 文档。待转换的.proto文件。仓库内置了一份带import的完整示例test.proto它引用了同目录的 imported.proto可以直接用来验证转换流程。基本转换命令flatc --proto test.proto--proto告诉 flatc 输入文件是 Protocol Buffers 格式输出为对应的.fbs文件。几个要点输出文件与输入同名、扩展名改为.fbs例如test.proto生成test.fbsGenerateProtoGoldens.sh 中每条命令执行后都用mv test.fbs ...改名可印证这一点。如果不指定-o PATH生成文件放在当前路径-o指定的路径以系统路径分隔符结尾例如/或\。生成文件首行是// Generated from test.proto.proto里的package proto.test;对应生成namespace proto.test;见 test_include.golden.fbs。处理 import 的 .proto.proto中的import语句在转换时会保留为.fbs里的include imported.fbs;语句。如果被引用的.proto不在当前目录用-I指定查找路径flatc --proto -I . test.proto只跑上面的命令只会生成主文件的.fbs被 import 的文件需要单独转换。仓库的示例脚本给出的做法是加--gen-all让 flatc 把当前文件及其 include 的所有文件一并生成flatc --proto --gen-all test.proto--gen-all的含义是“不仅为当前 schema 文件生成也为它 include 的所有文件生成”见 flatc 文档。常用转换选项以下选项都出现在 GenerateProtoGoldens.sh 和 flatc 源码的参数定义 中可按需组合--oneof-union把.proto的oneof翻译成 flatbuffer union。不加此选项时oneof被生成为一张匿名表如 test_include.golden.fbs 中的Anonymous0每个分支字段挂在表里加上后生成 union 类型效果对照 test_union.golden.fbs。--keep-proto-id在生成的.fbs中保留 protobuf 的字段 id字段会带上id: N属性效果见 test_include_id.golden.fbs。--proto-namespace-suffix SUFFIX为从 protobuf 生成的 flatbuffers 命名空间追加该后缀。示例脚本中的用法flatc --proto --gen-all --proto-namespace-suffix test_namespace_suffix test.proto--proto-id-gap warn当发现 protobuf 字段 id 之间存在间隙gap时打印警告不指定时默认为nop即不处理间隙。转换结果的结构变化对照 test_include.golden.fbs 和 test.proto转换时会发生这些结构变化嵌套 message 被提升到顶层放进自动生成的命名空间。例如ProtoMessage内嵌的OtherMessage变成namespace proto.test.ProtoMessage_.OtherMessage_;下的顶层 table。map 字段变成重复表mapstring, float grades生成grades:[proto.test.ProtoMessage_.GradesEntry];对应的GradesEntry表含key:string (key);和value:float;两个字段。默认值被保留optional int32 c 12 [default 16];生成c:int 16;。文档注释被保留///形式的注释会出现在生成的.fbs中。验证转换结果仓库对这条转换流程有标准的核对方式同一.proto、同一组选项生成的.fbs应与入库的 golden 文件一致。GenerateProtoGoldens.sh 用 flatc 生成了整套 golden 文件参数与 golden 的对应关系是命令选项对应 golden 文件flatc --proto test.prototest_include.golden.fbsflatc --proto --gen-all test.prototest.golden.fbsflatc --proto --oneof-union test.prototest_union_include.golden.fbsflatc --proto --gen-all --oneof-union test.prototest_union.golden.fbsflatc --proto --keep-proto-id test.prototest_include_id.golden.fbs用自己的 flatc 执行同样的命令后用diff将输出与对应 golden 文件比较一致即说明转换行为符合仓库预期flatc --proto test.proto diff test.fbs test_include.golden.fbs仓库的 C 测试 proto_test.cpp 还验证了两点可以当作你检查生成的.fbs时的参照一是生成结果必须能被 FlatBuffers 解析器再次解析通过二是含问题的.proto字段 id 重复、使用了 reserved id、非正数 id能通过解析阶段但在生成.fbs代码时失败——即这类输入不会产出可用的.fbs。支持范围与限制支持的构造见 flatc 文档package、message、enum、嵌套声明、import配合-I、extend、oneof、group。不支持但会静默跳过、不报错option、service、extensions以及“其他几乎所有内容”。这意味着命令执行成功并不代表.proto里的所有内容都被转换了——如果你的.proto依赖service定义 RPC生成的.fbs里不会有对应内容这一点需要自行核对输出确认。字段 id 存在间隙时默认静默忽略需要提醒时加--proto-id-gap warn。下一步.fbs生成并核对无误后就可以把它当作普通 FlatBuffers schema 使用继续用 flatc 加上语言生成器选项如--cpp、--java、--python完整列表见 flatc 文档为它生成目标语言的代码。【免费下载链接】flatbuffersFlatBuffers: Memory Efficient Serialization Library项目地址: https://gitcode.com/GitHub_Trending/fl/flatbuffers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进