使用transient關鍵字解決ehcache序列化錯誤
阿新 • • 發佈:2018-07-13
onu exc span www. final cnblogs gui 正常 tor
使用Ehcache時發現個不起眼的小問題
在一個Model中有以下代碼:
public class MyModel implements Serializable {
private static final long serialVersionUID = -990334519496260591L;
private IUserService us = ServiceManager.me.getUserService();
//getter and setter
}
在將這個Model的一個實例緩存到Ehcache時,如果恰好Ehcache配置了允許保存到磁盤,那麽就會提示錯誤:
ERROR DiskStorageFactory Disk Write of xxxxxxx failed:
java.io.NotSerializableException: com.my.service.impl.UserServiceImpl$$EnhancerByGuice$$80ede2b6
看錯誤提示,很明顯是 UserServiceImpl 對象無法序列化,原來是Ehcache把這個服務邏輯也看成了Model的普通屬性
正常情況下,將 UserServiceImpl 實現 Serializable 接口就可以解決問題
但實際上,這個服務是無狀態的單列模式,將它序列化到磁盤是沒有任何意義的,還會增加磁盤的IO開銷
那怎麽樣才能將Model成功緩存,又能刨除這些服務邏輯的屬性呢?
這時候,一個不起眼的關鍵字發揮了作用:transient
將上面的代碼改成如下,其實只是增加了這個關鍵字而已:
public class MyModel implements Serializable {
private static final long serialVersionUID = -990334519496260591L;
private transient IUserService us = ServiceManager.me.getUserService();
//getter and setter
}
再次緩存時,將不會提示錯誤。
這裏有一篇文章對 transient 關鍵字進行了更詳細的闡述:https://www.cnblogs.com/lanxuezaipiao/p/3369962.html
使用transient關鍵字解決ehcache序列化錯誤