之前使用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
的内容是一样的。