JAVA7环境下Spring容器对locale对象反序列的bug。

在JAVA7环境下,Spring容器在反序列化Locale对象时遇到问题,由于Locale的baseLocale字段为transient,导致无法正确初始化。为解决此问题,建议将Locale对象转换为String进行序列化和反序列化,以确保对象完整性和避免null值问题。
摘要由CSDN通过智能技术生成


Spring中对于对象的反序化时,需要调用readResolve方法来校验对象的完整性。对于java6的Locale对象,具体实现

private Object readResolve() throws java.io.ObjectStreamException {
        return getInstance(language, country, variant);
}

没有问题。但是对于JAVA7的实

private Object readResolve() throws java.io.ObjectStreamException {
           return getInstance(baseLocale.getLanguage(), baseLocale.getScript(),
                  baseLocale.getRegion(), baseLocale.getVariant(), localeExtensions);
}

我们知道调用readResolve 方法的Locale对象是spring框架中hessian实现,是通过sun.misc.UnSafe的allocateInstance方法用本地码在内存中直接生成,然后通过readObject(AbstractHessianInput in, Object obj,String[] fieldNames)将值赋给这个对象的字段,并没有调用对象的new 方法来进行构造,说白了就是没有通过java常规的构造方法来构造 。那么问题来了。

在java7中,Locale的baseLocale字段是一个transient字段,不会被序列化,它是在对象构造方法中根据其它几个字段动态构造的。

public Locale(String langu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值