flatbuffers的官网是真的坑,作为一个新技术,网上又没有太多中文的技术文档去解释它,学起来是真痛苦
这是官网给的语言支持功能对照表
官网告诉你用flatc编译器可以编译Javascript,但是最新版的flatbuffers已经抛弃了js的用法,按照官网的做法根本不得行。
在Vue项目中的具体使用方法
需要走schema->typrscript->javascript的路线,而flatbuffers官网的关于javascript的教程却没有对应的更新,而且schema->typescript生成的typescript代码是千差万别的,因此不建议跟随flatbuffers官网的关于javascript的教程进行操作(因为无法完全复现官网的教程)
1、使用flatc编译fbs文件为typescript文件
# 这个有个坑是生成的TS文件有类型错误,我项目中根本通不过Eslint检查
$ cd schema-path
# 使用flatc编译器将当前目录下的所有fbs文件编译为typescript
$ flatc --ts ./*.fbs
# 将会在当前目录下生成data的文件夹和.ts文件
$ ls
2、在项目中引入flatbuffers工具和TS文件
# 全局安装flatbuffer关于javascript的依赖库
$ npm install -g flatbuffers
# 全局安装tsc工具
$ npm install -g typescript
# 以上的库可以不安装在全局环境中,当你希望只在当前工程中使用,那么只需要在去掉-g参数即可;强烈建议你安装在全局环境中,因此这样比较容易使用tsc命令
3、将TS文件转换为JS文件
大家用flatc的时候肯定也看了转换出来的TS文件的,外部的TS文件是我们主程序文件(但其实里面没有实现方法,只是一个export的接口,如果对这个接口去转换,你会发现数据结构没有被转换为JavaScript文件);
所以我们直接进入到data文件夹中进行转换
# 进入到数据模型的文件夹
$ cd ./data
# tsc命令
$ npx tsc ./*.ts
# 清除不必要的TS文件
$ find . -name"*.ts" | xargs rm -rfv
在项目中实际使用flatbuffers
上一步生成JS文件之后ESlint检查就没有问题了(直接就没有类型了)
在项目的js中直接使用flatbuffers提供的API
//引入flatbuffers
import flatbuffers from "flatbuffers";
//引入模型文件
import {DF_Data} from "@/assets/js/mecdata_js/d-f_-data"
/**
*@author:AlbertOS
*@param message:所需要解释的二进制序列化数据
*/
export function JSgetData(message){
if(message!=null){
let data =new Uint8Array(message);//把序列化数据转换为2进制数组
let buf =new flatbuffers.ByteBuffer(data);//通过ByteBuffer这个API反序列化数组
let tempData = DF_Data.getRootAsDF_Data(buf);//通过模型文件的结构来解释数据
return tempData
}
else{
let datanull = "数据为空"
return datanull
}
}
总结
官网真不一定是对的,我们要抱着辩证的态度去看待~
这里的代码路径大家根据自己的来,这个flatbuffers折磨了我1周时间,从看英文文档的无所适从,到理解代码的解析逻辑这其中的收获满满(程序员的成功就是在一次次试错中成长起来的)
flatbuffers作为Goggles在17年新出的序列化格式在性能上比JSON格式高了几个量级,学习永不停歇!!!