1. 程式人生 > >java實現serializable介面的作用

java實現serializable介面的作用

一個物件序列化的介面,一個類只有實現了Serializable介面,它的物件才是可序列化的。因此如果要序列化某些類的物件,這些類就必須實現Serializable介面。而實際上,Serializable是一個空介面,沒有什麼具體內容,它的目的只是簡單的標識一個類的物件可以被序列化。

Serialize 是什麼?

這是IO儲存中的一個概念。計算機中所有的內容都是0或者1的數字。這些數字按順序排列,便可以表示計算機中的萬事萬物,當然Java的物件也不例外。在記憶體中,無論如何表示,對我們的操作都沒有影響,所以我們不必關心。但是,當我們需要把物件儲存到硬碟、資料庫或其它相關介質時,我們就需要考慮這個表示格式或者轉化方法。

Java的物件要如何轉化為這0、1的序列呢?就是靠序列化,使用java.io.ObjectOutputStream類即可完成複雜的轉化工作,但ObjectOutputStream類可以支援的只有實現了Serializable介面的物件,如果沒有實現Serializable介面,則會丟擲NotSerializableException。你希望序列化的類中,常常可能參雜了一些臨時性成員變數或者一些你並不希望它們被儲存下來的屬性,這些成員變數或者屬性,就需要用transient關鍵字修飾。它們會在序列化時被忽略。當從儲存介質中讀取並還原成物件時,他們會被還原為屬性的預設值(基本型別為0或false,物件為null)

JavaBean為什麼要實現java.io.Serializable介面實現序列化?

客戶端訪問了某個能開啟會話功能的資源, web伺服器就會建立一個與該客戶端對應的HttpSession物件,每個HttpSession物件都要站用一定的記憶體空間。如果在某一時間段內訪問站點的使用者很多,web伺服器記憶體中就會積累大量的HttpSession物件,消耗大量的伺服器記憶體,即使使用者已經離開或者關閉了瀏覽器,web伺服器仍要保留與之對應的HttpSession物件,在他們超時之前,一直佔用web伺服器記憶體資源。

web伺服器通常將那些暫時不活動但未超時的HttpSession物件轉移到檔案系統或資料庫中儲存,伺服器要使用他們時再將他們從檔案系統或資料庫中裝載入記憶體,這種技術稱為Session的持久化。

將HttpSession物件儲存到檔案系統或資料庫中,需要採用序列化的方式將HttpSession物件中的每個屬性物件儲存到檔案系統或資料庫中;將HttpSession物件從檔案系統或資料庫中裝載如記憶體時,需要採用反序列化的方式,恢復HttpSession物件中的每個屬性物件。所以儲存在HttpSession物件中的每個屬性物件必須實現Serializable介面。當然如果不是儲存在session中的JavaBean可以不用儲存哈。


好處:
a)比如說你的記憶體不夠用了,那計算機就要將記憶體裡面的一部分物件暫時的儲存到硬碟中,等到要用的時候再讀入到記憶體中,硬碟的那部分儲存空間就是所謂的虛擬記憶體。在比如過你要將某個特定的物件儲存到檔案中,我隔幾天在把它拿出來用,那麼這時候就要實現Serializable介面
b)在進行java的Socket程式設計的時候,你有時候可能要傳輸某一類的物件,那麼也就要實現Serializable介面;最常見的你傳輸一個字串,它是JDK裡面的類,也實現了Serializable介面,所以可以在網路上傳輸。
c)如果要通過遠端的方法呼叫(RMI)去呼叫一個遠端物件的方法,如在計算機A中呼叫另一臺計算機B的物件的方法,那麼你需要通過JNDI服務獲取計算機B目標物件的引用,將物件從B傳送到A,就需要實現序列化介面。