记录flatbuffers(typescript的使用)

892 阅读3分钟

关于使用flatbuffers和protobuffer进行前后端数据传递的优劣点以及介绍,大家能在众多文章中进行查询,该文只限记录flatbuffer在typescript中的的一些记录过程和我在开发过程中的一些收录。笔者会不断更新该文章,也希望文章能为读者作出贡献

一,什么是FlatBuffer

FlatBuffers 是一种高效的跨平台序列化库,它可以在不进行解析或反序列化的情况下直接访问数据。与其他序列化格式(如 JSON 或 XML)相比,FlatBuffers 具有更小的内存占用和更快的序列化和反序列化速度

特点

  1. 高性能:FlatBuffers 提供了快速的序列化和反序列化操作。由于数据是在内存中连续存储的,因此可以直接访问数据,无需解析整个结构。这使得 FlatBuffers 在性能敏感的应用程序中非常有用。
  2. 小内存占用:FlatBuffers 的数据结构是高度紧凑的,没有额外的字段标记或数据填充。这使得它在网络传输和存储中占用更少的空间。
  3. 跨平台支持:FlatBuffers 支持多种编程语言,包括 C++, C#, Java, Python, Go, Rust 等。这使得你可以在不同的平台和语言之间共享数据。
  4. 向后兼容性:FlatBuffers 允许在不破坏现有数据的情况下向数据结构中添加新字段。这使得你可以轻松地进行版本更新。

相关链接地址

二,安装

2.1 flatc

想通过flatc程序将fbs文件解析成ts文件,笔者建议前往release地址进行下载对应的可执行程序:Releases · google/flatbuffers (github.com)

2.2 typescript项目中使用

安装依赖

npm install flatbuffers
```

三,使用

  1. 定义 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;
    }
    
    
  2. 生成代码:使用 FlatBuffers 编译器将 FlatBuffers 模式转换为相应的编程语言代码。在 TypeScript 中,你可以使用 FlatBuffers 的 JavaScript/TypeScript 生成器来生成相应的 TypeScript 类和辅助函数。

    flatc --ts schema.fbs
    ```
    
    这将生成一个名为 `schema_generated.ts` 的文件,其中包含与你的 FlatBuffers 模式文件对应的 TypeScript 类和辅助函数。
    
  3. 使用 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
    ```