1. 程式人生 > >java實體類為什麼要實現序列化

java實體類為什麼要實現序列化

一、序列化的意義
客戶端訪問了某個能開啟會話功能的資源, web伺服器就會建立一個與該客戶端對應的HttpSession物件,每個HttpSession物件都要站用一定的記憶體空間。如果在某一時間段內訪問站點的使用者很多,web伺服器記憶體中就會積累大量的HttpSession物件,消耗大量的伺服器記憶體,即使使用者已經離開或者關閉了瀏覽器,web伺服器仍要保留與之對應的HttpSession物件,在他們超時之前,一直佔用web伺服器記憶體資源。
web伺服器通常將那些暫時不活動但未超時的HttpSession物件轉移到檔案系統或資料庫中儲存,伺服器要使用他們時再將他們從檔案系統或資料庫中裝載入記憶體,這種技術稱為Session的持久化。
將HttpSession物件儲存到檔案系統或資料庫中,需要採用序列化的方式將HttpSession物件中的每個屬性物件儲存到檔案系統或資料庫中;將HttpSession物件從檔案系統或資料庫中裝載如記憶體時,需要採用反序列化的方式,恢復HttpSession物件中的每個屬性物件。所以儲存在HttpSession物件中的每個屬性物件必須實現Serializable介面
Session的持久化的作用:


1.提高伺服器記憶體的利用率,保證那些暫停活動的客戶端在會話超時之前繼續原來的會話
2,在多臺web伺服器協同對外提供服務的集群系統中,使用Session的持久化技術,某臺伺服器可以將其中發生改變的Session物件複製給其他伺服器。保證了在某臺伺服器停止工作後可以由其他伺服器來接替它與客戶端的會話
3,在一個web應用程式重啟時,伺服器也會持久化該應用程式中所有HttpSession物件,保證客戶端的會話活動仍可以繼續。
Tomcat使用Session Manager 類來管理Session的持久化,他提供了兩個SessionManager類
org.apache.catalina.session.StandardManager
org.apache.catalina.session.PersistentManager
StandardManager是tomcat預設使用的,在web應用程式關閉時,對記憶體中的所有HttpSession物件進行持久化,把他們儲存到檔案系統中。預設的儲存檔案為
tomcat 安裝目錄>/work/Catalina/<主機名>/<應用程式名>/sessions.ser
PersistentManager比StandardManager更為靈活,只要某個裝置提供了實現org.apache.catalina.Store介面的驅動類,PersistentManager就可以將HttpSession物件儲存到該裝置
三、serialVersionUID 的作用

serialVersionUID 用來表明類的不同版本間的相容性

Java的序列化機制是通過在執行時判斷類的serialVersionUID來驗證版本一致性的。在進行反序列化時,JVM會把傳來的位元組流中的serialVersionUID與本地相應實體(類)的serialVersionUID進行比較,如果相同就認為是一致的,可以進行反序列化,否則就會出現序列化版本不一致的異常。

當實現java.io.Serializable介面的實體(類)沒有顯式地定義一個名為serialVersionUID,型別為long的變數時,Java序列化機制會根據編譯的class自動生成一個serialVersionUID作序列化版本比較用,這種情況下,只有同一次編譯生成的class才會生成相同的serialVersionUID 。

如果我們不希望通過編譯來強制劃分軟體版本,即實現序列化介面的實體能夠相容先前版本,未作更改的類,就需要顯式地定義一個名為serialVersionUID,型別為long的變數,不修改這個變數值的序列化實體都可以相互進行序列化和反序列化。