使用transient關鍵字解決ehcache序列化錯誤

使用Ehcache時發現個不起眼的小問題html

在一個Model中有如下代碼:java

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$$80ede2b6ui

看錯誤提示,很明顯是 UserServiceImpl 對象沒法序列化,原來是Ehcache把這個服務邏輯也當作了Model的普通屬性spa

正常狀況下,將 UserServiceImpl 實現 Serializable 接口就能夠解決問題code

但實際上,這個服務是無狀態的單列模式,將它序列化到磁盤是沒有任何意義的,還會增長磁盤的IO開銷htm

那怎麼樣才能將Model成功緩存,又能刨除這些服務邏輯的屬性呢?對象

 

這時候,一個不起眼的關鍵字發揮了做用:transientblog

將上面的代碼改爲以下,其實只是增長了這個關鍵字而已:接口

public class MyModel implements Serializable { private static final long serialVersionUID = -990334519496260591L; private transient IUserService us = ServiceManager.me.getUserService(); //getter and setter
 }

再次緩存時,將不會提示錯誤。

這裏有一篇文章對 transient 關鍵字進行了更詳細的闡述:http://www.javashuo.com/article/p-mhffiycv-g.html

相關文章
相關標籤/搜索