序列化與反序列化的簡單粗暴解釋

1、內容簡介java


1.什麼是序列化和反序列化?網絡


(1)序列化就是把Java對象轉化爲字節流序列(二進制串)的過程ide

(2)反序列化就是把字節流(二進制串)恢復爲Java對象的過程測試


2.爲何要進行序列化spa


    咱們知道,當兩個進程須要通訊的時候,能夠發送各類類型的數據,包括文字、圖片、音頻和視頻,可是這些數據都是以二進制的形式在網絡上傳輸。因此當兩個Java進程進行通訊的時候,如何實現進程間對象的傳送呢。這就須要用到序列化和反序列化了。一方面,發送方將這個Java對象轉化爲字節對象,而後在網絡上傳輸。另外一個方面,接收方須要從字節序列中恢復出Java對象。.net


3.好處orm


第一.利用序列化實現遠程的通訊,即在網絡上傳輸信息。第二,能夠實現數據的持久化,經過序列化能夠把數據永久的保存到硬盤上。視頻


2、Java類庫中的序列化對象


   Java.io.ObjectOutputStream表明對象輸出流,它的WriteObject( object obj) 方法能夠對指定的obj對象進行序列化,把獲得的二進制串輸入到指定的文件中。blog

  與此相對應,Java.io.ObjectInputStream表明對象輸入流,它的readObject(object obj)方法能夠將讀取的二進制串進行反序列化爲Java對象,而且將其返回。

只有實現了Serializable接口的類纔可以被序列化,因此必定要實現Serializable。跳進去你會發現,只有一個Serializable接口。

[java]  view plain  copy
 
 
  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"> * @author  unascribed  
  2.  * @version 1.2511/17/05  
  3.  * @see java.io.ObjectOutputStream  
  4.  * @see java.io.ObjectInputStream  
  5.  * @see java.io.ObjectOutput  
  6.  * @see java.io.ObjectInput  
  7.  * @see java.io.Externalizable  
  8.  * @since   JDK1.1  
  9.  */  
  10. public interface Serializable {  
  11. }</span>  

2.對象序列化的步驟以下


(1)建立對象輸入流,它能夠包裝一個其餘類型的目標輸入流,例如:文件輸出流。

(2)經過對象輸入流的writeObject()方法寫對象。


3.對象的反序列化以下:


(1)建立對象輸入流,一樣的,能夠包含其餘類型的目標輸出流,例如:文件輸入流。

(2)經過對象輸入流的readObject()方法讀取對象。


4.實例


(1)建立User對象

[java]  view plain  copy
 
 
  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">/** 
  2.  * 用戶 
  3.  * @author lizhenjuan 
  4.  */  
  5. public class User implements java.io.Serializable{  
  6.   
  7.     private static final long serialVersionUID = 1L;  
  8.     private Long id;  
  9.   
  10.     private String name; // 真實姓名  
  11.     private String loginName; // 登陸名  
  12.     private String description; // 說明  
  13. }  
  14. </span>  


(2)序列化Use對象

[java]  view plain  copy
 
 
  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"/** 
  2.      * User對象序列化測試代碼 
  3.      * @throws FileNotFoundException 
  4.      * @throws IOException 
  5.      */  
  6.     @Test  
  7.     private  static void SerializablePerson() throws Exception, FileNotFoundException, IOException{  
  8.           
  9.         User user = new User();  
  10.         user.setName("lizhenjuan");  
  11.         user.setLoginName("lzh");  
  12.         user.setDescription("just test");  
  13.           
  14.         //輸出流,將對象輸出到txt文件中  
  15.         ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(new File("F:/User.txt")));  
  16.         oo.writeObject(user);  
  17.         System.out.println("序列化成功!");  
  18.         oo.close();  
  19.           
  20.     }</span>  

執行結果,是在F 盤下生成了User.txt文件。


(3)反序列化User對象

 

[java]  view plain  copy
 
 
  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">/** 
  2.      * 反序列化User對象,對去User.txt文件內容 
  3.      * @return 
  4.      * @throws Exception 
  5.      * @throws FileNotFoundException 
  6.      * @throws IOException 
  7.      * @throws ClassNotFoundException 
  8.      */  
  9.     private  static User  DeserializePerson() throws  Exception,FileNotFoundException, IOException, ClassNotFoundException {  
  10.           
  11.         ObjectInputStream ois=new ObjectInputStream(new FileInputStream(new File("F:/User.txt")));  
  12.         User user =(User)ois.readObject();  
  13.         System.out.println("User對象反序列化成功");  
  14.         return user;              
  15.     }  
  16.            //讀取User.txt文件的內容  
  17.   
  18.           public  static void main(String[] args) throws Exception{  
  19.           
  20.         User user = DeserializePerson(); //反序列化對象  
  21.         System.out.println(MessageFormat.format("name={0},loginName={1},description={2}",  
  22.                 user.getName(),user.getLoginName(),user.getDescription()));   
  23.     }  
  24.   
  25.   
  26. </span>  


 

讀取F盤User.txt文件內容,打印出來。
打印內容以下:

 

3、SerialVersionUID 的做用


1.兩種類型


SerialVersionUID:意思是序列化的版本號,凡是實現序列化接口的類都會有一個表示序列化版本標識的靜態變量。
SerialVersionUID的兩種生成方式。
第一種
 採用這種方式生成的SerialVersionUID是1L;
private static final long serialVersionUID = 1L;
第二種
這一種是根據類名稱、接口名稱、方法和屬性來生成的。
private static final long serialVersionUID = 4603642343377807741L;


2.SerialVersionID做用是什麼?

     SerialVerssionID 保證在不少類中,某個類的編號是惟一的。若是在實體類中,沒有顯式聲明SerialVersionID,那麼java編譯器會自動給你生成一個ID。若是要在序列化以後的實體中添加一個字段,那麼序列化以後,就又會生成一個SerialVersionID ,因而就會出現兩個序列化版本號不一致的錯誤。因此,咱們在類中顯式聲明樂SerialVersionUID以後,就能夠在序列化以後,增長或者刪除一個字段,而不會影響到後期的還原。還原以後,可使用。    類的serialVersionUID的默認值徹底依賴於Java編譯器的實現,對於同一個類,用不一樣的Java編譯器編譯,有可能會致使不一樣的 serialVersionUID,也有可能相同。爲了提升serialVersionUID的獨立性和肯定性,強烈建議在一個可序列化類中顯示的定義serialVersionUID,爲它賦予明確的值。

相關文章
相關標籤/搜索