关于使用flatbuffers和protobuffer进行前后端数据传递的优劣点以及介绍,大家能在众多文章中进行查询,该文只限记录flatbuffer在typescript中的的一些记录过程和我在开发过程中的一些收录。笔者会不断更新该文章,也希望文章能为读者作出贡献
一,什么是FlatBuffer
FlatBuffers 是一种高效的跨平台序列化库,它可以在不进行解析或反序列化的情况下直接访问数据。与其他序列化格式(如 JSON 或 XML)相比,FlatBuffers 具有更小的内存占用和更快的序列化和反序列化速度
特点
- 高性能:FlatBuffers 提供了快速的序列化和反序列化操作。由于数据是在内存中连续存储的,因此可以直接访问数据,无需解析整个结构。这使得 FlatBuffers 在性能敏感的应用程序中非常有用。
- 小内存占用:FlatBuffers 的数据结构是高度紧凑的,没有额外的字段标记或数据填充。这使得它在网络传输和存储中占用更少的空间。
- 跨平台支持:FlatBuffers 支持多种编程语言,包括 C++, C#, Java, Python, Go, Rust 等。这使得你可以在不同的平台和语言之间共享数据。
- 向后兼容性:FlatBuffers 允许在不破坏现有数据的情况下向数据结构中添加新字段。这使得你可以轻松地进行版本更新。
相关链接地址
二,安装
2.1 flatc
想通过flatc程序将fbs文件解析成ts文件,笔者建议前往release地址进行下载对应的可执行程序:Releases · google/flatbuffers (github.com)
2.2 typescript项目中使用
安装依赖
npm install flatbuffers
```
三,使用
-
定义 FlatBuffers 模式:使用 FlatBuffers Schema Language (FBS) 定义你的数据结构。这是一个类似于结构体定义的语言,用于描述数据的布局和字段。例如,以下是一个简单的 FlatBuffers 模式示例:
namespace MyGame.Sample; table Monster { name: string; hp: short; pos: Vec3; } table Vec3 { x: float; y: float; z: float; } -
生成代码:使用 FlatBuffers 编译器将 FlatBuffers 模式转换为相应的编程语言代码。在 TypeScript 中,你可以使用 FlatBuffers 的 JavaScript/TypeScript 生成器来生成相应的 TypeScript 类和辅助函数。
flatc --ts schema.fbs ``` 这将生成一个名为 `schema_generated.ts` 的文件,其中包含与你的 FlatBuffers 模式文件对应的 TypeScript 类和辅助函数。 -
使用 FlatBuffers:在 TypeScript 代码中,你可以使用生成的
schema_generated.ts文件中的类和函数来创建、序列化和访问 FlatBuffers 对象。import { flatbuffers } from 'flatbuffers'; import { Monster, Vec3 } from './schema_generated'; // 创建一个 FlatBuffers 构建器 const builder = new flatbuffers.Builder(); // 创建一个 Vec3 对象 const vec = Vec3.createVec3(builder, 1.0, 2.0, 3.0); // 创建一个 Monster 对象 const name = builder.createString('Orc'); Monster.startMonster(builder); Monster.addName(builder, name); Monster.addHp(builder, 100); Monster.addPos(builder, vec); const monster = Monster.endMonster(builder); // 完成构建器并获取序列化的 FlatBuffer builder.finish(monster); // 获取序列化后的 FlatBuffer 数据 const buffer = builder.asUint8Array(); // 反序列化 FlatBuffer 数据 const monsterObject = Monster.getRootAsMonster(new flatbuffers.ByteBuffer(buffer)); // 访问字段值 const monsterName = monsterObject.name(); const monsterHP = monsterObject.hp(); const monsterPos = monsterObject.pos(); console.log(monsterName); // 输出:Orc console.log(monsterHP); // 输出:100 console.log(monsterPos.x()); // 输出:1.0 console.log(monsterPos.y()); // 输出:2.0 console.log(monsterPos.z()); // 输出:3.0 ```