IDEA配置Java使用protobuf请参考
1.
proto文件转js文件命令
:
pbjs -t static-module -w commonjs -o proto.js *.proto
2.
Proto数据
:
syntax = "proto3";
package grace.proto.msg;
message Person {
string id = 1;
string name = 2;
string email = 3;
}
3.
Java端代码
:
//测试protobuf数据的接口
@PostMapping("/protobuf")
public String getProtoBuf(@RequestParam(value = "id", defaultValue = "") String str){
try {
// //数据封装
// //获取Person对象
// Protos.UserCache.Builder builder = Protos.UserCache.newBuilder();
// //通过person的内部类builder提供了构建相关属性的set方法
// builder.setUID(1);
// builder.setName("张三");
// builder.setHead(1);
// //序列化对象
// Protos.UserCache person = builder.build();
// System.out.print("数据大小"+person.toByteString().size()+"\n");
//数据拆分
System.out.print("打印传递参数111:"+str+"\n");
byte[] bytes = Base64.getDecoder().decode(str);
System.out.print("数据为222:"+bytes+"\n");
PersonMsg.Person p = null;
try {
p = PersonMsg.Person.parseFrom(bytes);
System.out.print("数据为333:"+p.getId()+"\n");
System.out.print("数据为444:"+p.getName()+"\n");
System.out.print("数据为555:"+p.getEmail()+"\n");
}catch (InvalidProtocolBufferException e){
System.out.print("异常为:"+e+"\n");
}
return String.valueOf(str);
}catch (Exception e){
return e.toString();
}
}
Java端打印数据:
打印传递参数111:CgExEgblvKDkuIkaDOS4jeWRiuivieS9oA==
数据为222:[B@77b050f4
数据为333:1
数据为444:张三
数据为555:不告诉你
4.
CocosCreator端代码(TS)
:
onLoad() {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
// console.log("aaa结束了", xhr.responseText);
//获取到后台传递过来的protobuf字符串
// var nnnn = xhr.responseText;
};
let protobuf = require("protobuf");
let protores = require("proto");
var msgType = protores.grace.proto.msg.Person;
//封装数据
var d = { id: "1", name: "张三", email: "不告诉你" };
var msg = msgType.create(d);
var bytes = msgType.encode(msg).finish();
cc.log("msg: ", msg);
cc.log("bytes: ", bytes);
//封装
var b64 = protobuf.util.base64.encode(bytes, 0, bytes.length);
cc.log("b64: ", b64);
拆分数据
// var msg = msgType.decode(b64);
// var data = msgType.toObject(msg, {
// longs: Number, //long默认转换为Number类型
// enums: String,
// bytes: String
// // see ConversionOptions
// });
// cc.log("data: ", data);
xhr.open("POST", "http://127.0.0.1:8888/test/protobuf?id=" + b64, true);
xhr.send();
console.log("======================");
}
CocosCreator打印数据:
5.
问题以及解决办法
:
-
问题1:Java端解析异常InvalidProtocolBufferException
– 例子中涉及的编码格式分为:Base64网络传输码CgExEgblvKDkuIkaDOS4jeWRiuivieS9oA==、Cocos端Uint8Array编码[10,1,49,…]、Java端byte数组:[B@77b050f4。
– 其中后台需要在byte[]中和Base64编码中转换、前端需要在Uint8Array和Base64进行转换。具体代码例子中有。 - 问题2: Cocos端转码问题
尝试了很多代码,只有这个转的可用,其他不适报错就不变
var b64 = protobuf.util.base64.encode(bytes, 0, bytes.length);
版权声明:本文为yangshuaionline原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。