之前使用dubbo服务的过程中发生了一个关于hessian序列化引起的bug,有点意思,记录一下。
hessian序列化Collections.emptyList()时,会转换成ArrayList(),并且同一对象内会共用同一个ArrayList对象,例如:
ProductDTO.java
以下代码:
以上代码的productDTO是从dubbo服务获取的,虽然ProductDTO的默认值是Collections.emptyList()(代码@1),但由于Collections#EMPTY_LIST并无实现序列化接口,hessian在序列化的过程中将其转换成ArrayList,并且同一对象内的Collections.emptyList()都会共用同一个ArrayList对象,造成执行@2操作的时候,partsDTOs和carTypeDTOs同样持有相同的ArrayList对象(java是伪泛型,运行期会抹除),所以当打开debugger或将productDTO序列化成JSON时会发现productAttributeDTOs, partsDTOs和carTypeDTOs的内容是一样的。