方案一:正常方式
安装
npm i protobufjs
npm i --save-dev protobufjs-cli
这是 pbjs/pbts 的命令行工具,旧版的 protobufjs pbjs/pbts 是直接在包内的,最新的分开了
npx pbjs -t json proto/test.proto > proto/test.json 将proto下的文件转成json文件
使用方案
dict:Record<string, protobuf.Type> = {};
private _inited:boolean;
private static _ins:ProtoMgr;
static get ins(){
return this._ins ||= new ProtoMgr();
}
parse(cb:Handler){
ResourceUtil.loadDirRes("proto", JsonAsset, (err, assets)=>{
if(assets){
for (let index = 0; index < assets.length; index++) {
const res = assets[index];
const root = protobuf.Root.fromJSON(res.json);
const keys = Object.keys(res.json.nested);
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
this.dict[AppMessageType[key]] = root.lookupType(key);
}
}
this._inited = true;
cb && cb.run();
}
})
}
/**
* 序列化数据
* @param type
* @param data
* @returns 返回unit8array数据
*/
encode(type:AppMessageType, data:any){
if(! this._inited){
console.warn("没有初始化完成---");
return null;
}
if(this.dict[type]){
return this.dict[type].encode(data).finish();
}else{
Log.warn("没有对应的序列化数据" + type, data);
}
}
decode(type:AppMessageType, data:any){
if(! this._inited){
console.warn("没有初始化完成---");
return null;
}
if(this.dict[type]){
return this.dict[type].decode(data);
}else{
Log.warn("没有对应的反序列化数据" + type, data);
}
}
方案二:直接使用pbjs通过proto文件生成ts文件不需要再依赖protobufjs
- npm install -g pbjs 安装依赖库
- 同级目录下使用cmd命令 pbjs test.proto --ts test.ts 装换ts文件
- 也可以转换js文件 pbjs test.proto --es6 test.js