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;
}