某次往Redis里面缓存对象,发现取出的对象里面,BigDecimal属性全都变成了0。后发现问题出在使用的序列化、反序列化的工具Hessian上面。
Hessian的这个问题,从网上搜索,可以说是一大堆。看到早期的解决方案是在jar包的META-INF目录里面新建hessian目录,并填入两个配置文件,告诉Hessian,类的转换关系。
但是现在大家都用maven等构建工具构建项目,这个办法就没意义了,因为你不可能把maven服务器上的jar包修改了,只能看官方的修复。 可这个问题在官方的BUG列表里面,http://bugs.caucho.com/view.php?id=3920 提交从10年被提交,最后16年还有人问为啥没修复,甚至现在9102年了,还是new状态。真是没辙了。
更加奇葩的是已经有人确认,4.0.37版修复了这个问题(不知道为啥没更新BUG列表),将两个配置文件放了进去,但是到了后面的版本不知道为啥,文件没了,BUG重新回来了。
截止到写这篇文章,我只能确认19年2月发布的4.0.60版本是携带着两个配置文件的,可以正常序列化。而列表里面上一个版本的4.0.51(17年3月)就没有。至于51-60之间的版本哪里去了,不知道。4.0.7(10年,也就是这版有人说这个问题)到4.0.51,为啥7年间的版本全看不到,也不知道。
大家如果在使用Hessian的过程中发现序列化反序列化问题,请选择存在配置文件的版本,大概率就修复了。 最后附上配置文件内容
deserializers:
java.io.File=com.caucho.hessian.io.FileDeserializer
java.math.BigDecimal=com.caucho.hessian.io.BigDecimalDeserializer
javax.management.ObjectName=com.caucho.hessian.io.ObjectNameDeserializer
serializers:
com.caucho.hessian.io.HessianRemoteObject=com.caucho.hessian.io.RemoteSerializer
com.caucho.burlap.io.BurlapRemoteObject=com.caucho.hessian.io.RemoteSerializer
java.io.File=com.caucho.hessian.io.StringValueSerializer
java.math.BigDecimal=com.caucho.hessian.io.StringValueSerializer
java.util.Locale=com.caucho.hessian.io.LocaleSerializer
javax.management.ObjectName=com.caucho.hessian.io.StringValueSerializer