java實(shí)體類為什么要實(shí)現(xiàn)序列化
java實(shí)體類為什么要實(shí)現(xiàn)序列化
解答如下:當(dāng)客戶端訪問某個能開啟會話功能的資源,web服務(wù)器就會創(chuàng)建一個HTTPSession對象百科,每個HTTPSession對象都會占用一定的內(nèi)存,如果在同一個時間段內(nèi)訪問的用戶太多,就會消耗大量的服務(wù)器內(nèi)存,為了解決這個問題我們使用一種技術(shù):session的持久化。什么是session的持久化?web服務(wù)器會把暫時不活動的并且沒有失效的HTTPSession對象轉(zhuǎn)移到文件系統(tǒng)或數(shù)據(jù)庫中儲存,服務(wù)器要用時在把他們轉(zhuǎn)載到內(nèi)存。
把Session對象轉(zhuǎn)移到文件系統(tǒng)或數(shù)據(jù)庫中儲存就需要用到序列化; java.io.Serializable。
在tomcat重啟的時候進(jìn)行一個鈍化操作、啟動成功之后再進(jìn)活化。在對應(yīng)的區(qū)域加載進(jìn)來,不會丟失(前提是session中的存放的變量必須實(shí)現(xiàn)序列化接口才能鈍化,才能序列到硬盤上的一個二進(jìn)制文件中去)。
為什么實(shí)體類要實(shí)現(xiàn)serializable接口序列化
當(dāng)客戶端訪問可以打開會話功能的資源時,web服務(wù)器會創(chuàng)建一個與客戶端對應(yīng)的HttpSession對象,每個HttpSession對象都會使用一定的內(nèi)存空間。如果在一定時間內(nèi)有大量用戶訪問網(wǎng)站,那么大量的HttpSession對象就會堆積在web服務(wù)器的內(nèi)存中,這會消耗大量的服務(wù)器內(nèi)存。
即使用戶已經(jīng)離開或關(guān)閉了瀏覽器,web服務(wù)器仍然會保留相應(yīng)的HttpSession對象,這將占用web服務(wù)器的內(nèi)存資源,直到它們超時。
Web服務(wù)器通常會將那些暫時處于非活動狀態(tài)但尚未超時的HttpSession對象傳輸?shù)轿募到y(tǒng)或數(shù)據(jù)庫中進(jìn)行存儲,然后在服務(wù)器想要使用它們時將它們從文件系統(tǒng)或數(shù)據(jù)庫加載到內(nèi)存中。這項(xiàng)技術(shù)被稱為會話持久性。 要將HttpSession對象保存到文件系統(tǒng)或數(shù)據(jù)庫,需要將HttpSession對象中的每個屬性對象序列化到文件系統(tǒng)或數(shù)據(jù)庫。當(dāng)從文件系統(tǒng)或數(shù)據(jù)庫(如內(nèi)存)加載HttpSession對象時,需要對其進(jìn)行反序列化,以恢復(fù)HttpSession對象中的每個屬性對象。
因此,存儲在HttpSession對象中的每個屬性對象都必須實(shí)現(xiàn)Serializable接口。 簡言之,就是為了 將對象的狀態(tài)保存在存儲媒體中以便可以在以后重新創(chuàng)建出完全相同的副本。實(shí)現(xiàn) Serializable接口還能 按值將對象從一個應(yīng)用程序域發(fā)送至另一個應(yīng)用程序域。
Java中為什么要序列化?什么時候用到序列化?
序列化可以將內(nèi)存中的類寫入文件或數(shù)據(jù)庫中。比如將某個類序列化后存為文件,下次讀取時只需將文件中的數(shù)據(jù)反序列化就可以將原先的類還原到內(nèi)存中。
也可以將類序列化為流數(shù)據(jù)進(jìn)行傳輸。
總的來說就是將一個已經(jīng)實(shí)例化的類轉(zhuǎn)成文件存儲,下次需要實(shí)例化的時候只要反序列化即可將類實(shí)例化到內(nèi)存中并保留序列化時類中的所有變量和狀態(tài)。例如:hibernate中實(shí)體類的鈍化就是將類序列化后存入磁盤并釋放內(nèi)存空間。