java實體類序列化
1. java實體類為什麼要實現序列化
解答如下:
當客戶端訪問某個能開啟會話功能的資源,web伺服器就會創建一個HTTPSession對象,每個HTTPSession對象都會佔用一定的內存,如果在同一個時間段內訪問的用戶太多,就會消耗大量的伺服器內存,為了解決這個問題我們使用一種技術:session的持久化。
什麼是session的持久化?
web伺服器會把暫時不活動的並且沒有失效的HTTPSession對象轉移到文件系統或資料庫中儲存,伺服器要用時在把他們轉載到內存。
把Session對象轉移到文件系統或資料庫中儲存就需要用到序列化; java.io.Serializable。
在tomcat重啟的時候進行一個鈍化操作、啟動成功之後再進活化。
在對應的區域載入進來,不會丟失(前提是session中的存放的變數必須實現序列化介面才能鈍化,才能序列到硬碟上的一個二進制文件中去)。
2. java中的序列化是什麼意思
序列化是將對象狀態轉換為可保持或傳輸的格式的過程。說白點就是你可以用對象輸出流輸出到文件。如果不序列化輸出的話,很可能會亂。
java中的序列化機制能夠將一個實例對象(只序列化對象的屬性值,而不會去序列化什麼所謂的方法。)的狀態信息寫入到一個位元組流中使其可以通過socket進行傳輸、或者持久化到存儲資料庫或文件系統中;然後在需要的時候通過位元組流中的信息來重構一個相同的對象。
一般而言,要使得一個類可以序列化,只需簡單實現java.io.Serializable介面即可。
3. JAVA 壓縮和序列化
壓縮和序列化主要用在數據的存儲和傳輸上,二者都是由IO流相關知識實現,這里統一介紹下。
全部章節傳送門:
Java I/O類支持讀寫壓縮格式的數據流,你可以用他們對其他的I/O流進行封裝,以提供壓縮功能。
GZIP介面比較簡單,適合對單個數據流進行壓縮,在Linux系統中使用較多。
ZIP格式可以壓縮多個文件,而且可以和壓縮工具進行協作,是經常使用的壓縮方法。
JAR(Java Archive,Java 歸檔文件)是與平台無關的文件格式,它允許將許多文件組合成一個壓縮文件。為 J2EE 應用程序創建的 JAR 文件是 EAR 文件(企業 JAR 文件)。
JAR 文件格式以流行的 ZIP 文件格式為基礎。與 ZIP 文件不同的是,JAR 文件不僅用於壓縮和發布,而且還用於部署和封裝庫、組件和插件程序,並可被像編譯器和 JVM 這樣的工具直接使用。在 JAR 中包含特殊的文件,如 manifests 和部署描述符,用來指示工具如何處理特定的 JAR。
如果一個Web應用程序的目錄和文件非常多,那麼將這個Web應用程序部署到另一台機器上,就不是很方便了,我們可以將Web應用程序打包成Web 歸檔(WAR)文件,這個過程和把Java類文件打包成JAR文件的過程類似。利用WAR文件,可以把Servlet類文件和相關的資源集中在一起進行發布。在這個過程中,Web應用程序就不是按照目錄層次結構來進行部署了,而是把WAR文件作為部署單元來使用。
一個WAR文件就是一個Web應用程序,建立WAR文件,就是把整個Web應用程序(不包括Web應用程序層次結構的根目錄)壓縮起來,指定一個.war擴展名。下面我們將第2章的Web應用程序打包成WAR文件,然後發布
要注意的是,雖然WAR文件和JAR文件的文件格式是一樣的,並且都是使用jar命令來創建,但就其應用來說,WAR文件和JAR文件是有根本區別的。JAR文件的目的是把類和相關的資源封裝到壓縮的歸檔文件中,而對於WAR文件來說,一個WAR文件代表了一個Web應用程序,它可以包含 Servlet、HTML頁面、Java類、圖像文件,以及組成Web應用程序的其他資源,而不僅僅是類的歸檔文件。
在命令行輸入jar即可查看jar命令的使用方法。
把對象轉換為位元組序列的過程稱為對象的序列化。把位元組序列恢復為對象的過程稱為對象的反序列化。
對象的序列化主要有兩種用途:
java.io.ObjectOutputStream代表對象輸出流,它的writeObject(Object obj)方法可對參數指定的obj對象進行序列化,把得到的位元組序列寫到一個目標輸出流中。
java.io.ObjectInputStream代表對象輸入流,它的readObject()方法從一個源輸入流中讀取位元組序列,再把它們反序列化為一個對象,並將其返回。
只有實現了Serializable的對象才能被序列化。對象序列化包括如下步驟:
對象反序列化的步驟如下:
創建一個可以可以序列化的對象。
然後進行序列化和反序列化測試。
serialVersionUID: 字面意思上是序列化的版本號,凡是實現Serializable介面的類都有一個表示序列化版本標識符的靜態變數。
JAVA序列化的機制是通過判斷類的serialVersionUID來驗證的版本一致的。在進行反序列化時,JVM會把傳來的位元組流中的serialVersionUID於本地相應實體類的serialVersionUID進行比較。如果相同說明是一致的,可以進行反序列化,否則會出現反序列化版本一致的異常,即是InvalidCastException。
為了提高serialVersionUID的獨立性和確定性,強烈建議在一個可序列化類中顯示的定義serialVersionUID,為它賦予明確的值。
控制序列化欄位還可以使用Externalizable介面替代Serializable借口。此時需要定義一個默認構造器,否則將為得到一個異常(java.io.InvalidClassException: Person; Person; no valid constructor);還需要定義兩個方法(writeExternal()和readExternal())來控制要序列化的欄位。
如下為將Person類修改為使用Externalizable介面。
transient修飾符僅適用於變數,不適用於方法和類。在序列化時,如果我們不想序列化特定變數以滿足安全約束,那麼我們應該將該變數聲明為transient。執行序列化時,JVM會忽略transient變數的原始值並將默認值(引用類型就是null,數字就是0)保存到文件中。因此,transient意味著不要序列化。
靜態變數不是對象狀態的一部分,因此它不參與序列化。所以將靜態變數聲明為transient變數是沒有用處的。
4. 什麼是序列化,在java中如何實現序列化
一、什麼是序列化:x0dx0a序列化理解成「打碎」是可以的,不過在書本上的名詞就是將對象轉換成二進制。x0dx0ax0dx0a二、在java中如何實現序列化:x0dx0a首先我們要把准備要序列化類,實現 Serializabel介面x0dx0a例如:我們要Person類里的name和age都序列化x0dx0aimport java.io.Serializable;x0dx0ax0dx0apublic class Person implements Serializable { //本類可以序列化x0dx0a private String name ;x0dx0a private int age ;x0dx0a x0dx0a public Person(String name,int age){x0dx0a this.name = name ;x0dx0a this.age = age ;x0dx0a }x0dx0a public String toString(){x0dx0a return "姓名:" + this.name + ",年齡" + this.age ;x0dx0a }x0dx0a}x0dx0ax0dx0a然後:我們將name和age序列化(也就是把這2個對象轉為二進制,統族理解為「打碎」)x0dx0apackage org.lxh.SerDemo;x0dx0ax0dx0aimport java.io.File;x0dx0aimport java.io.FileOutputStream;x0dx0aimport java.io.ObjectOutputStream ;x0dx0ax0dx0apublic class ObjectOutputStreamDemo { //序列化x0dx0ax0dx0a public static void main(String[] args) throws Exception {x0dx0a//序列化後生成指定文件路徑x0dx0a File file = new File("D:" + File.separator + "person.ser") ; ObjectOutputStream oos = null ;x0dx0a//裝飾流(流)x0dx0a oos = new ObjectOutputStream(new FileOutputStream(file)) ; x0dx0a//實例化類x0dx0a Person per = new Person("張三",30) ; oos.writeObject(per) ;//把類對象序列化x0dx0a oos.close() ;x0dx0a }x0dx0a}
5. Java中為什麼要序列化什麼時候用到序列化
序列化可以將內存中的類寫入文件或資料庫中。比如將某個類序列化後存為文件,下次讀取時只需將文件中的數據反序列化就可以將原先的類還原到內存中。也可以將類序列化為流數據進行傳輸。總的來說就是將一個已經實例化的類轉成文件存儲,下次需要實例化的時候只要反序列化即可將類實例化到內存中並保留序列化時類中的所有變數和狀態。
例如:hibernate中實體類的鈍化就是將類序列化後存入磁碟並釋放內存空間。
6. 什麼是java序列化
Java中的序列化是把Java對象轉換為位元組序列的過程,能夠將一個實例對象的狀態信息寫入到一個位元組流中,使其可以通過socket進行傳輸、或者持久化到存儲資料庫或文件系統中,然後在需要的時候通過位元組流中的信息來重構一個相同的
7. 淺談java中為什麼實體類需要實現序列化
序列化的意義
客戶端訪問了某個能開啟會話功能的資源,
web伺服器就會創建一個與該客戶端對應的HttpSession對象,每個HttpSession對象都要站用一定的內存空間。
如果在某一時間段內訪問站點的用戶很多,web伺服器內存中就會積累大量的HttpSession對象,消耗大量的伺服器內存,即使用戶已經離開或者關閉了瀏覽器,web伺服器仍要保留與之對應的HttpSession對象,在他們超時之前,一直佔用web伺服器內存資源。
web伺服器通常將那些暫時不活動但未超時的HttpSession對象轉移到文件系統或資料庫中保存,伺服器要使用他們時再將他們從文件系統或資料庫中裝載入內存,這種技術稱為Session的持久化。
將HttpSession對象保存到文件系統或資料庫中,需要採用序列化的方式將HttpSession對象中的每個屬性對象保存到文件系統或資料庫中;將HttpSession對象從文件系統或資料庫中裝載如內存時,需要採用反序列化的方式,恢復HttpSession對象中的每個屬性對象。
所以存儲在HttpSession對象中的每個屬性對象必須實現Serializable介面
8. 在JAVA中什麼叫序列化和反序列化
java對象實現了序列化就可以以對象的形式在流中傳輸。不管是文件流,還是Socket流都可以x0dx0a 用ObjectInputStream ObjectOutputStream 來讀寫對象。x0dx0a 並不是所以類都可以序列化,一般需要序列化的對象是那些實體類。什麼Bean,pojo,vo貌似都是一個意思吧。。。還是有一些對象是不能序列化的,Socket對象是不能的。還有一些忘記了,還有一些不知道···呵呵~~x0dx0a 實現序列化只要實現一個Serializable的介面就行,這是個標志介面,裡面沒有方法需要實現,主要的作用就是標識這兒類可以序列化·····
9. java 中的序列化是什麼意思
對象要想在網路中傳輸,或者存放的本地磁碟時,需要對其序列化。
最常見的就是視頻流文件的讀取(網路傳輸) 和 ORM框架(存儲到資料庫)
10. java中如何實現序列化,有什麼意義
首先我們要把准備要序列化類,實現 Serializabel介面
例如:我們要Person類里的name和age都序列化
import java.io.Serializable;
public class Person implements Serializable { //本類可以序列化
private String name ;
private int age ;
public Person(String name,int age){
this.name = name ;
this.age = age ;
}
public String toString(){
return "姓名:" + this.name + ",年齡" + this.age ;
}
}
然後:我們將name和age序列化(也就是把這2個對象轉為二進制,統族理解為「打碎」)
package org.lxh.SerDemo;
import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream ;
public class ObjectOutputStreamDemo { //序列化
public static void main(String[] args) throws Exception {
//序列化後生成指定文件路徑
File file = new File("D:" + File.separator + "person.ser") ; ObjectOutputStream oos = null ;
//裝飾流(流)
oos = new ObjectOutputStream(new FileOutputStream(file)) ;
//實例化類
Person per = new Person("張三",30) ; oos.writeObject(per) ;//把類對象序列化
oos.close() ;
}
}
