Java中的Serializable接口和transient關鍵字
Table of Contents
- 1. 向memcached中放資料時遇到NotSerializableException異常
- 2. 問題排查和解決
- 3. 總結
1 向memcached中放資料時遇到NotSerializableException異常
項目中用到了memcached緩存,存儲客戶的組織結構,以便提高系統性能。之前系統運作正常,近期為了和Portal對接,更新了涉及到組織結構的jar包(由公司産品部門維護),更新之後發現組織結構不能放到緩存中了,報java.io.NotSerializableException異常。
2 問題排查和解決
經過排查,發現産品部門修改了實體類Orgnization,增加了一個Transaction類成員變量,該變量沒有實作Serializable接口,而Memcached要求要存儲的對象要實作Serializable接口,是以出現異常。
通過反編譯、修改、編譯并替換的方式,給Transaction成員變量增加了Serializable接口聲明,還是不行,發現在org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper上報java.io.NotSerializableException異常,原來,Transaction類後面一堆資料庫操作相關定義,這下就不能通過修改第三方的類來解決問題了。
最終,通過給Transaction類成員變量增加transient解決了該問題。通過該關鍵字,可以關閉成員變量的串行化。這樣,不管後面有多少沒有實作Serializable接口的類,都沒有關系。而且該關鍵字隻在串行化時起作用,不影響正常的業務處理邏輯。
3 總結
- 注意實作Serializable接口和transient關鍵字的差別和作用
- 實體類中實際上不适合包含資料庫處理的相關代碼(設計問題)
- 放緩存時,可以考慮使用自己的實體類,盡量不使用第三方類,以便發生更新變化時造成影響。(設計問題)
問題:java編譯器針對類本身實作了Serializable接口的,但是成員變量沒有實作該接口或者沒有聲明為transient的,為什麼不報錯或者警告一下呢?
Author: galaxy
Created: 2015-07-02 Thu 16:02
Emacs 24.4.1 (Org mode 8.2.10)
Validate
轉載于:https://www.cnblogs.com/galaxy-gao/p/4612761.html