问题排查
根据堆栈信息可见,dubbo使用默认的hession2进行序列化时出现了异常,异常堆栈根原因为:null array
位于java.util.CollSer#readResolve方法中,即在序列化集合时,集合数组为空。
向上追溯jdk.internal.reflect.NativeMethodAccessorImpl#invoke,中可以看到传入的array确实为null,
继续向上追溯,在com.alibaba.com.caucho.hessian.io.JavaDeserializer#readObject(com.alibaba.com.caucho.hessian.io.AbstractHessianInput, java.lang.Object, java.lang.String[])中使用com.alibaba.com.caucho.hessian.io.JavaDeserializer.ObjectListFieldDeserializer的反序列化方法,
查看改反序列化方法,其调用了,com.alibaba.com.caucho.hessian.io.Hessian2Input#readObject(java.lang.Class, java.lang.Class<?>…)方法,
该方法根据tag区分具体使用哪种类别进行序列化,通过debug对比List与ArrayList,可以看到List的tag为67,调用的是case 'C’的判定,走的是object反序列化逻辑,而ArrayList的tag是113,调用的是case 0x77的判定,
在com.alibaba.com.caucho.hessian.io.CollectionDeserializer#readLengthList(com.alibaba.com.caucho.hessian.io.AbstractHessianInput, int, java.lang.Class<?>)中会对list进行赋值。
修改建议
避免在dubbo中使用immutable类集合,尤其注意jdk9以上的stream.toList()方法会返回immutableList,建议使用stream.collect(Collectors.toList())或手动修改为new ArrayList<>()。