天天看點

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

使用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

寵辱不驚,看庭前花開花落;去留無意,望天上雲卷雲舒

繼續閱讀