已经找到了该问题产生的原因,是因为前端使用protobuf,iogame使用的是jprotobuf。
protobuf中字段值等于默认值时,序列化时字段不会进行赋值,反序列化后所有没被赋值的字段都被赋对应类型的默认值;而jprotobuf完全按照用户输入的意愿,序列化之前赋值什么,序列化时就有什么,反序列化时也对应有什么。
所以前端传0时会被序列化为null值,后端接收到的也就是null值了
虽然找到了原因,但是没找到解决办法,目前我通过就是避开传递0值来解决
还有一个办法是在群里沟通过的,后端使用int类型来接收,正常情况下可以解决,但是有一个特殊的情况就不行了,如果参数只有这一个参数,那么后端接收到的实体对象就会是null
目前有两种方法可以解决这个问题。
第一种
参考代码
// 请求端传入的字节数据
byte[] data = new byte[]{... ...};
// 使用原生的 pb ExternalMessage 来解析数据
var externalMessage = Proto.ExternalMessage.parseFrom(data);
Proto.ExternalMessage 是在本地编译的原生 pb 文件,参考 https://www.yuque.com/iohao/game/xeokui
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
后续介绍的几种需要使用 17.1.31 及以上版本
第二种
从 issu 描述中,因为是单一参数,可以使用框架提供的业务参数自动装箱、拆箱基础类型
第三种
将这个对象添加到 MethodParsers.mappingParamSupplier(Class> paramClass, Supplier> supplier); 中,这是一个参数解析器的配置
第四种
实现一个 MethodParser 接口的实现类,框架默认提供的是 DefaultMethodParser。
// 假设 MyMethodParser 是你重写的实现类
public class MyMethodParser implements MethodParser {
... ... 省略部分代码
@Override
public Object parseParam(byte[] data, ActionCommand.ParamInfo paramInfo) {
Class<?> actualTypeArgumentClazz = paramInfo.getActualTypeArgumentClazz();
if (Objects.isNull(data)) {
try {
return actualTypeArgumentClazz.getConstructor().newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
return DataCodecKit.decode(data, actualTypeArgumentClazz);
}
}
将 MyMethodParser 配置到 MethodParsers.methodParser 中
第三种与第四种类似,只是第三种是提前配置好的,而第四种则是通过暴力 newInstance 的方式。
登录 后才可以发表评论