JAVA語言序列化和反序列化一目瞭然(一)認識

在JAVA中,一個大的應用程序需要保存很多對象的時候,由於虛擬機內存有限,(資源寶貴啊 )有時不可能所有有用的對象都放到內存中,因此,需要將不常用的對象暫時持久化的文件中,當需要這個對象時,再從文件把對象恢復到內存中,這就是所謂對象的序列化和反序列化。本文講實現如何將對象序列化到文件,然後再從文件反序列化到對象,你會發現其實特別簡單

 

先看一下對象的序列化和反序列化的關鍵是什麼

1,首先被序列化的對象必須實現 java.io.Serializable 接口,咳~~咳~~,其實這個接口沒定義任何方法

 

2,序列化時,需要用到對象輸出流ObjectOutputStream ,然後通過文件輸出流構造 ObjectOutputStream 對象調用writeObject寫入到文件

 

3,反之,反序列化時用到對象輸入流ObjectIntputStream,  然後通過文件輸出流構造 ObjectIntputStream對象調用readObject加載到內存,注意,是返回萬能Object類型

 

4,注意:序列化時transient變量(這個關鍵字的作用就是告知JAVA我不可以被序列化)和靜態變量不會被序列化(關於靜態變量不會序列化保留意見,本實例先不用靜態變量)

 

5,也是最應該注意的,如果你先序列化對象A後序列化B,那麼在反序列化的時候一定記着JAVA規定先讀到的對象是先被序列化的對象,不要先接收對象B,那樣會報錯

 

好了,現在我們做一個實例,我們現在要序列化一個會員對象到文件裏,然後再把它讀出來

先創建會員類

 

Java代碼  
  1. import java.io.*;   
  2. import java.util.*;   
  3.   
  4. //一定要實現Serializable接口才能被序列化   
  5. public class UserInfo implements Serializable {   
  6.     public String userName;   
  7.     public String userPass;   
  8.     //注意,userAge變量前面的transient   
  9.     public transient int userAge;   
  10.   
  11.     public UserInfo(){   
  12.     }   
  13.   
  14.     public UserInfo(String username,String userpass,int userage){   
  15.         this.userName=username;   
  16.         this.userPass=userpass;   
  17.         this.userAge=userage;   
  18.     }   
  19.   
  20.     public String toString(){   
  21.         return "用戶名: "+this.userName+";密碼:"+this.userPass+   
  22.             ";年齡:"+this.userAge;   
  23.     }   
  24. }  

 接着我們開始寫如何序列化和反序列化,初學認真看哦

Java代碼  
  1. import java.io.*;   
  2. import java.util.*;   
  3. public class Test {   
  4.   
  5.     //序列化對象到文件   
  6.     public static void serialize(String fileName){   
  7.         try  
  8.         {   
  9.             //創建一個對象輸出流,講對象輸出到文件   
  10.             ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(fileName));   
  11.   
  12.             out.writeObject("序列化日期是:");  //序列化一個字符串到文件   
  13.   
  14.             out.writeObject(new Date());    //序列化一個當前日期對象到文件   
  15.   
  16.             UserInfo user=new UserInfo("renyanwei","888888",20);   
  17.             out.writeObject(user);  //序列化一個會員對象   
  18.   
  19.             out.close();   
  20.         }   
  21.         catch (Exception x)   
  22.         {   
  23.             System.out.println(x.toString());   
  24.         }   
  25.            
  26.     }   
  27.     //從文件反序列化到對象   
  28.     public static void deserialize(String fileName){   
  29.         try  
  30.         {   
  31.             //創建一個對象輸入流,從文件讀取對象   
  32.             ObjectInputStream in=new ObjectInputStream(new FileInputStream(fileName));   
  33.   
  34.             //注意讀對象時必須按照序列化對象順序讀,否則會出錯   
  35.             //讀取字符串   
  36.             String today=(String)(in.readObject());   
  37.             System.out.println(today);   
  38.   
  39.             //讀取日期對象   
  40.             Date date=(Date)(in.readObject());   
  41.             System.out.println(date.toString());   
  42.   
  43.             //讀取UserInfo對象並調用它的toString()方法   
  44.             UserInfo user=(UserInfo)(in.readObject());             
  45.             System.out.println(user.toString());   
  46.   
  47.             in.close();   
  48.         }   
  49.         catch (Exception x)   
  50.         {   
  51.             System.out.println(x.toString());   
  52.         }   
  53.            
  54.     }   
  55.   
  56.     public static void main(String[] args) {       
  57.         serialize("D://test.txt");   
  58.         System.out.println("序列化完畢");   
  59.   
  60.         deserialize("D://test.txt");   
  61.         System.out.println("反序列化完畢");   
  62.     }   
  63.   
  64. }  

運行結果:


序列化完畢
今天是:
Thu Oct 23 18:31:11 CST 2008
用戶名: renyanwei;密碼:888888;年齡:0
反序列化完畢

我們看代碼總結一下,serialize方法實現了對象的序列化功能,講對象序列化到文件,使用了文件的輸出流ObjectOutputStream 的writerObject方法一次寫入一個對象,對象在文件中按寫入順序存儲。

deserialize方法實現反序列化,從文件將對象反序列化到內存,使用了ObjectIntputStream 的readObject方法,因爲序列化對象是按照寫入順序存儲的,所以在反序列化時必須按照寫入順序讀取

大家看了結果就應該知道了,標明transit的實例變量是沒被序列化進去的 ,呵呵

 

其實序列化的意義不止如此,不但可以將對象放到文件流,還可以放到網絡流裏,比如我們做的Socket程序,你不但可以發送給對方一行消息,還可以發送過去一個對象,我估計QQ就不止是把我們的消息發送到對方,應該是一個對象,裏面包含了發送者的信息什麼的。呵呵 有興趣的可以做一下哈

 

轉自:http://renyanwei.iteye.com/blog/257239

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章