氟塑料離心泵www.buybeng.com

          jquery教程http://www.software8.co/wzjs/jquery/

          Java序列化與反序列化

          Java序列化與反序列化是什么?為什么需要序列化與反序列化?如何實現(xiàn)Java序列化與反序列化?本文圍繞這些問題進行了探討。

           1.Java序列化與反序列化

           Java序列化是指把Java對象轉(zhuǎn)換為字節(jié)序列的過程;而Java反序列化是指把字節(jié)序列恢復(fù)為Java對象的過程。

           2.為什么需要序列化與反序列化

           我們知道,當(dāng)兩個進程進行遠程通信時,可以相互發(fā)送各種類型的數(shù)據(jù),包括文本、圖片、音頻、視頻等, 而這些數(shù)據(jù)都會以二進制序列的形式在網(wǎng)絡(luò)上傳送。那么當(dāng)兩個Java進程進行通信時,能否實現(xiàn)進程間的對象傳送呢?答案是可以的。如何做到呢?這就需要Java序列化與反序列化了。換句話說,一方面,發(fā)送方需要把這個Java對象轉(zhuǎn)換為字節(jié)序列,然后在網(wǎng)絡(luò)上傳送;另一方面,接收方需要從字節(jié)序列中恢復(fù)出Java對象。

           當(dāng)我們明晰了為什么需要Java序列化和反序列化后,我們很自然地會想Java序列化的好處。其好處一是實現(xiàn)了數(shù)據(jù)的持久化,通過序列化可以把數(shù)據(jù)永久地保存到硬盤上(通常存放在文件里),二是,利用序列化實現(xiàn)遠程通信,即在網(wǎng)絡(luò)上傳送對象的字節(jié)序列。

          3.如何實現(xiàn)Java序列化與反序列化

          1)JDK類庫中序列化API

           java.io.ObjectOutputStream:表示對象輸出流

          它的writeObject(Object obj)方法可以對參數(shù)指定的obj對象進行序列化,把得到的字節(jié)序列寫到一個目標(biāo)輸出流中。

          java.io.ObjectInputStream:表示對象輸入流

          它的readObject()方法源輸入流中讀取字節(jié)序列,再把它們反序列化成為一個對象,并將其返回。

          2)實現(xiàn)序列化的要求

          只有實現(xiàn)了Serializable或Externalizable接口的類的對象才能被序列化,否則拋出異常。

          3)實現(xiàn)Java對象序列化與反序列化的方法

          假定一個Student類,它的對象需要序列化,可以有如下三種方法:

          方法一:若Student類僅僅實現(xiàn)了Serializable接口,則可以按照以下方式進行序列化和反序列化

          ObjectOutputStream采用默認(rèn)的序列化方式,對Student對象的非transient的實例變量進行序列化。

          ObjcetInputStream采用默認(rèn)的反序列化方式,對對Student對象的非transient的實例變量進行反序列化。

          方法二:若Student類僅僅實現(xiàn)了Serializable接口,并且還定義了readObject(ObjectInputStream in)和writeObject(ObjectOutputSteam out),則采用以下方式進行序列化與反序列化。

          ObjectOutputStream調(diào)用Student對象的writeObject(ObjectOutputStream out)的方法進行序列化。

          ObjectInputStream會調(diào)用Student對象的readObject(ObjectInputStream in)的方法進行反序列化。

          方法三:若Student類實現(xiàn)了Externalnalizable接口,且Student類必須實現(xiàn)readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法,則按照以下方式進行序列化與反序列化。

          ObjectOutputStream調(diào)用Student對象的writeExternal(ObjectOutput out))的方法進行序列化。

          ObjectInputStream會調(diào)用Student對象的readExternal(ObjectInput in)的方法進行反序列化。

          4)JDK類庫中序列化的步驟

          步驟一:創(chuàng)建一個對象輸出流,它可以包裝一個其它類型的目標(biāo)輸出流,如文件輸出流:

          ObjectOutputStream out = new ObjectOutputStream(new fileOutputStream(“D:\\objectfile.obj”));

          步驟二:通過對象輸出流的writeObject()方法寫對象:

          out.writeObject(“Hello”);

          out.writeObject(new Date());

          5)JDK類庫中反序列化的步驟

          步驟一:創(chuàng)建一個對象輸入流,它可以包裝一個其它類型輸入流,如文件輸入流:

          ObjectInputStream in = new ObjectInputStream(new fileInputStream(“D:\\objectfile.obj”));

          步驟二:通過對象輸出流的readObject()方法讀取對象:

          String obj1 = (String)in.readObject();

          Date obj2 = (Date)in.readObject();

          說明:為了正確讀取數(shù)據(jù),完成反序列化,必須保證向?qū)ο筝敵隽鲗憣ο蟮捻樞蚺c從對象輸入流中讀對象的順序一致。

          為了更好地理解Java序列化與反序列化,選擇方法一編碼實現(xiàn)。

          Student類定義如下:

          1. package com.jieke.io;  
          2. import java.io.Serializable;  
          3.   
          4. /** 
          5.  *Title:學(xué)生類 
          6.  *Description:實現(xiàn)序列化接口的學(xué)生類 
          7.  *Copyright: copyright(c) 2012 
          8.  *Filename: Student.java 
          9.  *@author Wang Luqing 
          10.  *@version 1.0 
          11.  */  
          12. public class Student implements Serializable  
          13. {  
          14.  private String name;  
          15.  private char sex;  
          16.  private int year;  
          17.  private double gpa;  
          18.   
          19.  public Student()  
          20.  {  
          21.   
          22.  }  
          23.  public Student(String name,char sex,int year,double gpa)  
          24.  {  
          25.   this.name = name;  
          26.   this.sex = sex;  
          27.   this.year = year;  
          28.   this.gpa = gpa;  
          29.  }  
          30.   
          31.  public void setName(String name)  
          32.  {  
          33.   this.name = name;  
          34.  }  
          35.   
          36.  public void setSex(char sex)  
          37.  {  
          38.   this.sex = sex;  
          39.  }  
          40.   
          41.  public void setYear(int year)  
          42.  {  
          43.   this.year = year;  
          44.  }  
          45.   
          46.  public void setGpa(double gpa)  
          47.  {  
          48.   this.gpa = gpa;  
          49.  }  
          50.   
          51.  public String getName()  
          52.  {  
          53.   return this.name;  
          54.  }  
          55.    
          56.  public char getSex()  
          57.  {  
          58.   return this.sex;  
          59.  }  
          60.   
          61.  public int getYear()  
          62.  {  
          63.   return this.year;  
          64.  }  
          65.   
          66.  public double getGpa()  
          67.  {  
          68.   return this.gpa;  
          69.  }  
          70. }  

          把Student類的對象序列化到文件O:\\Java\\com\\jieke\\io\\student.txt,并從該文件中反序列化,向console顯示結(jié)果。代碼如下:

          1. import java.io.*;  
          2.   
          3. /** 
          4.  *Title:應(yīng)用學(xué)生類 
          5.  *Description:實現(xiàn)學(xué)生類實例的序列化與反序列化 
          6.  *Copyright: copyright(c) 2012 
          7.  *Filename: UseStudent.java 
          8.  *@author Wang Luqing 
          9.  *@version 1.0 
          10.  */  //www.heatpress123.net
          11.   
          12. public class UseStudent  
          13. {  
          14.  public static void main(String[] args)  
          15.  {  
          16.   Student st = new Student("Tom",'M',20,3.6);  
          17.   File file = new File("O:\\Java\\com\\jieke\\io\\student.txt");  
          18.   try  
          19.   {  
          20.    file.createNewFile();  
          21.   }  
          22.   catch(IOException e)  
          23.   {  
          24.    e.printStackTrace();  
          25.   }  
          26.   try  
          27.   {  
          28.    //Student對象序列化過程  
          29.    FileOutputStream fos = new FileOutputStream(file);  
          30.    ObjectOutputStream oos = new ObjectOutputStream(fos);  
          31.    oos.writeObject(st);  
          32.    oos.flush();  
          33.    oos.close();  
          34.    fos.close();  
          35.   
          36.    //Student對象反序列化過程  
          37.    FileInputStream fis = new FileInputStream(file);  
          38.    ObjectInputStream ois = new ObjectInputStream(fis);  
          39.    Student st1 = (Student) ois.readObject();  
          40.    System.out.println("name = " + st1.getName());  
          41.    System.out.println("sex = " + st1.getSex());  
          42.    System.out.println("year = " + st1.getYear());  
          43.    System.out.println("gpa = " + st1.getGpa());  
          44.    ois.close();  
          45.    fis.close();  
          46.   }  
          47.   catch(ClassNotFoundException e)  
          48.   {  
          49.    e.printStackTrace();  
          50.   }  
          51.   catch (IOException e)  
          52.   {  
          53.    e.printStackTrace();  
          54.   }               
          55.  }  
          56. }  

          結(jié)果如下所示:

          name = Tom

          sex = M

          year = 20

          gpa = 3.6

          總結(jié):

          1)Java序列化就是把對象轉(zhuǎn)換成字節(jié)序列,而Java反序列化就是把字節(jié)序列還原成Java對象。

          2)采用Java序列化與反序列化技術(shù),一是可以實現(xiàn)數(shù)據(jù)的持久化,在MVC模式中很是有用;二是可以對象數(shù)據(jù)的遠程通信。
          個人網(wǎng)站  www.software8.co

          posted on 2012-09-26 09:03 你爸是李剛 閱讀(1239) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          <2012年9月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿

          隨筆檔案

          文章檔案

          技術(shù)網(wǎng)站

          行業(yè)網(wǎng)站

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          站長網(wǎng) 氟塑料離心泵 注塑機 液晶廣告機
          主站蜘蛛池模板: 乐都县| 思南县| 大同市| 濉溪县| 剑河县| 神农架林区| 康马县| 伊通| 长顺县| 大厂| 开阳县| 南涧| 托克逊县| 罗田县| 阿拉尔市| 马关县| 河池市| 荔浦县| 陆河县| 安福县| 沭阳县| 涿鹿县| 农安县| 牟定县| 商水县| 萝北县| 凤山市| 桂东县| 曲阳县| 蒲江县| 九台市| 兴仁县| 大庆市| 米易县| 紫云| 分宜县| 偃师市| 兴文县| 荥经县| 从江县| 新源县|