公司动态
FlatBuffer数据写入指南:用FlatBufferBuilder API将PeopleList序列化为二进制文件的完整教程
FlatBuffer数据写入指南用FlatBufferBuilder API将PeopleList序列化为二进制文件的完整教程【免费下载链接】FlatBufferFlatBuffer : Android Sample Application项目地址: https://gitcode.com/gh_mirrors/fl/FlatBufferFlatBuffer 数据写入是上手这套高性能序列化框架的第一步。本文以开源的FlatBuffer Android 示例项目实测对比 FlatBuffer 与 JSON 加载速度为例手把手教你用FlatBufferBuilderAPI 把PeopleList表格序列化成二进制文件——项目实测中读取同一份数据 FlatBuffer 仅耗时1ms而 JSON 高达2515ms快了近 2500 倍。为什么选择 FlatBuffer性能提升有多猛FlatBuffer 是 Google 开源的序列化库最大特点是零解析开销数据在写入时就排布好内存位置读取时无需解包直接内存偏移即可取值。下面的截图来自本示例 App 的实测界面点击两个按钮分别加载二进制文件和 JSON 文本可以看到差距是数量级的。但要享受这种速度前提是你会写入正确的二进制文件。下面进入正题。准备数据模型从 .fbs 模式文件到 Java 类FlatBuffer 写入的第一步不是写代码而是定义模式Schema。项目内置了一份可直接参考的模式文件app/src/main/res/raw/sample_schema.fbstable PeopleList { peoples : [People]; } table People { id : string; index : long; name : string; gender : string; email : string; friends : [Friend]; } table Friend { id : long; name : string; } root_type PeopleList;用 flatc 编译器对该.fbs文件生成 Java 代码后就得到了app/src/main/java/com/flatbuffer/flatmodel/目录下的三个模型类文件作用PeopleList.java根表格包含 peoples 向量People.java人员信息含 friends 向量Friend.java好友信息最内层结构注意这些类是自动生成的不要手动修改文件头有automatically generated, do not modify提示。每个类都自带createXxx、startXxx、addXxx、endXxx一套写入辅助方法例如 People.java 中的createPeople(builder, ...)。FlatBufferBuilder 的核心规则从内向外、反向写入FlatBufferBuilder位于app/libs/flatbuffers-java-1.3.0-SNAPSHOT.jar中写入有两条铁律先写被引用者再写引用者因为写入时就要记录偏移量所以必须先写Friend再写People最后写PeopleList向量元素也要倒序写createXxxVector辅助方法已帮你处理无需操心。一句话记忆由内向外逐层引用。完整示例将 PeopleList 序列化为二进制文件结合示例数据sample_json.json 中的第一条记录完整写入代码如下FlatBufferBuilder builder new FlatBufferBuilder(1024); // 第1步写最内层的 Friend int friendName builder.createString(Simon Pollard); int friend Friend.createFriend(builder, 0, friendName); // 第2步写 People先 friends 向量再各字段 int friends People.createFriendsVector(builder, new int[]{friend}); int pId builder.createString(569537e48784f992a235ab16); int pName builder.createString(Preston Lowery); int pGender builder.createString(male); int pEmail builder.createString(prestonloweryinjoy.com); int person People.createPeople(builder, pId, 0, 0, pName, pGender, 0, pEmail, friends); // 第3步写根表格 PeopleList 并结束构建 int peoples PeopleList.createPeoplesVector(builder, new int[]{person}); int root PeopleList.createPeopleList(builder, peoples); PeopleList.finishPeopleListBuffer(builder, root); // 第4步导出字节并写入二进制文件 byte[] data builder.sizedByteArray(); FileOutputStream out new FileOutputStream(peoplelist.bin); out.write(data); out.close();几个关键细节字符串必须先用builder.createString()写成int偏移量再传给addXxxcreatePeople的参数顺序由生成代码固定id, index, guid, name, gender, company, email, friends不想填的字段传0即可finishPeopleListBuffer会在文件头写入根偏移量这正是读取端能一步定位入口的关键生成的.bin文件可放入res/raw/目录作为内置资源项目中自带的成品就是app/src/main/res/raw/sample_flatbuffer.bin。反向验证读回二进制文件确认写入成功写入后最可靠的验证方式是读回来。示例项目 MainActivity.java 的loadFromFlatBuffer方法展示了标准读取姿势byte[] buffer Utils.readRawResource(getApplication(), R.raw.sample_flatbuffer); ByteBuffer bb ByteBuffer.wrap(buffer); PeopleList peopleList PeopleList.getRootAsPeopleList(bb); // 逐条访问全程无解析开销 for (int i 0; i peopleList.peoplesLength(); i) { People p peopleList.peoples(i); Log.d(TAG, p.name() | p.email() | 好友数: p.friendsLength()); }读取端只做了三件事ByteBuffer.wrap包装字节数组 →getRootAsPeopleList一步定位根表 → 链式访问字段。能顺利读出数据说明你的写入完全正确。资源读取工具类见app/src/main/java/com/flatbuffer/utils/Utils.java。避坑指南FlatBuffer 数据写入的 3 个常见错误⚠️顺序颠倒在写People之前就尝试引用它的偏移量会得到 0 或脏数据。牢记被引用者必须先写入。⚠️字段数不匹配手动调用startObject(n)时n必须等于 schema 中该 table 的字段总数如People是 8多写少写都会导致校验失败。直接使用生成的createXxx方法可完全避免此坑。⚠️Builder 复用finish之后同一个FlatBufferBuilder实例不能继续写入如需多次序列化请新建实例。总结FlatBuffer 数据写入的核心流程只有四步定义.fbs模式文件用 flatc 生成模型类按从内向外的顺序用FlatBufferBuilder逐层写入调用finishXxxBuffer收尾导出字节数组落盘用getRootAsXxx读回验证。掌握这套流程后你就能在自己的项目中享受本文开头展示的那种 1ms vs 2515ms 的读取速度了 【免费下载链接】FlatBufferFlatBuffer : Android Sample Application项目地址: https://gitcode.com/gh_mirrors/fl/FlatBuffer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考