1. 程式人生 > >使用transient關鍵字解決ehcache序列化錯誤

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

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序列化錯誤