xstream“强转自己(Object->TypeA)”报错:
com.****.TypeA can not be cast to com.****.TypeA
原因:
存储的是 TypeA 经过 Java 标准序列化后的内容,取值时返回的是 Object,需要强转为 TypeA。本来很简单的逻辑,但是出现异常了,异常爆出 TypeA 不能转为 TypeA,我们俩再三确认了一下,类名没有写错。
我想到以前我看过的一本书上(忘了从哪本书看的了)说:Java 中,判断两个类型是否相同需要:1.两个类有相同的限定名;2.两个类由同一类加载器实例加载。既然类限定名是没有问题的,那么只能说明要强转成的 TypeA 和从中取回的 TypeA(Java 标准反序列化生成的实例的 class)不是由同一类加载器实例加载的。
实例场景:
最近在使用xstream时发现同一个实体类不能相互转化,最后发现在SpringBoot
中使用 xstream不会自动装载ClassLoader,需手动配置ClassLoader。
//工具转换类
public Object toBean(Class<?> clazz,String xml){
Object xmlObject=null;
XStream xStream=new XStream(new DomDriver(“UTF-8”, new XmlFriendlyNameCoder("-", "")));
//应用传过来类的注解
xStream.processAnnotations(clazz);
//自动检测注解
xStream.autodetectAnnotations(true);
//手动设置ClassLoader
xStream.setClassLoader(clazz.getClassLoader());
xmlObject=xStream.fromXML(xml);
return xmlObject;
}