Hessian不能正确序列化和反序列化BigDecimal的解决

作者在往Redis缓存对象时,发现Hessian序列化、反序列化工具存在问题,导致取出对象的BigDecimal属性变为0。早期解决方案在使用maven构建项目时不可行,官方BUG多年未修复。已知4.0.37版曾修复但后续版本问题重现,确认4.0.60版可正常序列化,建议选择有配置文件的版本,并附上配置文件内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

某次往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

 

转载于:https://my.oschina.net/wlmouse/blog/3053308

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值