Open Gaion opened 7 years ago
翻了半天源码,发现,使用 kyro、fst 进行序列化时,参数为 null 的情况下,就不写入参数的数量,导致在反序列化的时候由于获取不到参数数量而报错,默认的序列化访问正常。问一下,原来为啥设计成这样?是 BUG,还是有特殊考虑?
序列化时的代码,com.alibaba.dubbo.rpc.protocol.dubbo.DubboCodec的encodeRequestData方法
protected void encodeRequestData(Channel channel, ObjectOutput out, Object data) throws IOException {
.....
if (getSerialization(channel) instanceof OptimizedSerialization) { //kyro、fst序列化
if (!containComplexArguments(inv)) { //写入参数数量
out.writeInt(inv.getParameterTypes().length);
} else { //无参数
out.writeInt(-1);
}
} else { //其他序列化方式
out.writeUTF(ReflectUtils.getDesc(inv.getParameterTypes()));
}
.....
}
private boolean containComplexArguments(RpcInvocation invocation) {
for (int i = 0; i < invocation.getParameterTypes().length; i++) {
if (invocation.getArguments()[i] == null || invocation.getParameterTypes()[i] != invocation.getArguments()[i].getClass()) { //参数为 null,或者实际参数类型与定义不一致?
return true;
}
}
return false;
}
反序列化时的代码,com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation 的 decode 方法
public Object decode(Channel channel, InputStream input) throws IOException {
.....
int argNum = -1;
if (CodecSupport.getSerialization(channel.getUrl(), serializationType) instanceof OptimizedSerialization) { //kyro、fst 序列化时,读取参数数量
argNum = in.readInt();
}
if (argNum >= 0) { // 包含参数的处理
...
} else { //没有读取到参数,则认为是其他序列化
...
}
...
}
使用过程中,发现一个问题,直连情况下参数传 null 正常,但是从注册中心走一遍,报错~
api
提供方
消费者
消费者直连XML
调用后提供方输出
消费者通过注册中心的XML
调用后提供方输出
提供方报错
消费者报错