180 Star 1.6K Fork 502

渔民小镇 / ioGame

 / 详情

前端(c#)请求参数是int等数值类型时,如果传递的值为0,后端接收到的值为null

已完成
创建于  
2023-01-28 20:36

已经找到了该问题产生的原因,是因为前端使用protobuf,iogame使用的是jprotobuf。
protobuf中字段值等于默认值时,序列化时字段不会进行赋值,反序列化后所有没被赋值的字段都被赋对应类型的默认值;而jprotobuf完全按照用户输入的意愿,序列化之前赋值什么,序列化时就有什么,反序列化时也对应有什么。
所以前端传0时会被序列化为null值,后端接收到的也就是null值了

虽然找到了原因,但是没找到解决办法,目前我通过就是避开传递0值来解决 :blush:

还有一个办法是在群里沟通过的,后端使用int类型来接收,正常情况下可以解决,但是有一个特殊的情况就不行了,如果参数只有这一个参数,那么后端接收到的实体对象就会是null

评论 (3)

张崧 创建了任务
张崧 修改了描述
展开全部操作日志

目前有两种方法可以解决这个问题。

第一种

  1. 重写游戏对外服的编解码部分,使用原生的 proto 来编解码,参考 ExternalCodecWebsocket 、ExternalCodecSocket。
  2. 当编解码重新实现后,参考游戏对外服扩展文档 https://www.yuque.com/iohao/game/ea6geg#noCqn ,替换 ExternalChannelInitializerCallbackFactory 中的默认实现类。

参考代码

// 请求端传入的字节数据
byte[] data = new byte[]{... ...};

// 使用原生的 pb ExternalMessage 来解析数据
var externalMessage = Proto.ExternalMessage.parseFrom(data);

Proto.ExternalMessage 是在本地编译的原生 pb 文件,参考 https://www.yuque.com/iohao/game/xeokui

ok,那第二种办法是什么 :smile:

渔民小镇 任务状态待办的 修改为进行中

后续介绍的几种需要使用 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 的方式。

渔民小镇 任务状态进行中 修改为已完成

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(2)
5475 iohao 1653332816
Java
1
https://gitee.com/iohao/ioGame.git
git@gitee.com:iohao/ioGame.git
iohao
ioGame
ioGame

搜索帮助