氟塑料離心泵www.buybeng.com

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

          Java序列化與反序列化

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

           1.Java序列化與反序列化

           Java序列化是指把Java對象轉換為字節序列的過程;而Java反序列化是指把字節序列恢復為Java對象的過程。

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

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

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

          3.如何實現Java序列化與反序列化

          1)JDK類庫中序列化API

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

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

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

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

          2)實現序列化的要求

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

          3)實現Java對象序列化與反序列化的方法

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

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

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

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

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

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

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

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

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

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

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

          步驟一:創建一個對象輸出流,它可以包裝一個其它類型的目標輸出流,如文件輸出流:

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

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

          out.writeObject(“Hello”);

          out.writeObject(new Date());

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

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

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

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

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

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

          說明:為了正確讀取數據,完成反序列化,必須保證向對象輸出流寫對象的順序與從對象輸入流中讀對象的順序一致。

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

          Student類定義如下:

          1. package com.jieke.io;  
          2. import java.io.Serializable;  
          3.   
          4. /** 
          5.  *Title:學生類 
          6.  *Description:實現序列化接口的學生類 
          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顯示結果。代碼如下:

          1. import java.io.*;  
          2.   
          3. /** 
          4.  *Title:應用學生類 
          5.  *Description:實現學生類實例的序列化與反序列化 
          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. }  

          結果如下所示:

          name = Tom

          sex = M

          year = 20

          gpa = 3.6

          總結:

          1)Java序列化就是把對象轉換成字節序列,而Java反序列化就是把字節序列還原成Java對象。

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

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


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


          網站導航:
           
          <2012年9月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          導航

          統計

          常用鏈接

          留言簿

          隨筆檔案

          文章檔案

          技術網站

          行業網站

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          站長網 氟塑料離心泵 注塑機 液晶廣告機
          主站蜘蛛池模板: 绍兴市| 横峰县| 遂平县| 永德县| 砀山县| 乳源| 孟州市| 渝中区| 临湘市| 鞍山市| 深州市| 静乐县| 兴安盟| 无极县| 迭部县| 贵德县| 普安县| 宁乡县| 葫芦岛市| 比如县| 安阳县| 江源县| 会泽县| 武义县| 大安市| 桂东县| 紫云| 台前县| 浪卡子县| 浦江县| 常德市| 乐至县| 墨玉县| 封丘县| 曲松县| 杂多县| 阳原县| 长兴县| 武宁县| 五莲县| 兴国县|