問題排查
根據堆棧信息可見,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<>()。