用protobuf来做消息的载体 嵌套了两三层 用了Any这个类型 ,
java那边很容易 直接Any.pack() 或者 属性.unpack()
想来js那边应该也差不多 但是不知道怎么弄 ,搜来搜去网上关于protobuf的资料还是太少了,
最后在"Google Protobuf Any" javscript example · Issue #68 · protocolbuffers/protobuf-javascript · GitHub找到了
编码方式如下
1.package.json 引入protobuf的依赖 "google-protobuf": "^3.19.6", 版本应该要跟后端的保持一致
2.引入any_pb.js require('google-protobuf/google/protobuf/any_pb');
3.new 一个Any对象 const systemMessageWrapperAny = new proto.google.protobuf.Any();
4.Any对象调用打包方法pack()
systemMessageWrapperAny.pack(newUint8Array(appPreviewMessage.serializeBinary()),"AppPreviewMessage") 此处的参数适自己情况改,字符串是要打包的类型的包名
解码的方式如下
let message = proto.Message.deserializeBinary(new Uint8Array(evt.data)); console.log("外层接收消息:" + message); let systemMessageWrapper = message.getPayload().unpack(proto.SystemMessageWrapper.deserializeBinary,"SystemMessageWrapper"); console.log("第二层接收消息:" + systemMessageWrapper.getType()); let appPreviewMessage = systemMessageWrapper.getPayload().unpack(proto.AppPreviewMessage.deserializeBinary,"AppPreviewMessage"); console.log("第三层接收消息:" + appPreviewMessage.getResponse());
proto文件编译成pb.js后 any类型的字段的set方法的参数确实也是any 所以 找到解决方法后感觉应该自己能想到的,只能说protobuf的资料还是太少了