日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Java序列化與反序列化

 神志屋 2017-10-20
                  Java序列化與反序列化是什么?為什么需要序列化與反序列化?如何實(shí)現(xiàn)Java序列化與反序列化?本文圍繞這些問題進(jìn)行了探討。

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

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

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

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

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

1)JDK類庫中序列化API

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

out.writeObject(“Hello”);

out.writeObject(new Date());

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

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

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序列化與反序列化,選擇方法一編碼實(shí)現(xiàn)。

Student類定義如下:

  1. package com.jieke.io;  
  2. import java.io.Serializable;  
  3.   
  4. /** 
  5.  *Title:學(xué)生類 
  6.  *Description:實(shí)現(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:實(shí)現(xiàn)學(xué)生類實(shí)例的序列化與反序列化 
  6.  *Copyright: copyright(c) 2012 
  7.  *Filename: UseStudent.java 
  8.  *@author Wang Luqing 
  9.  *@version 1.0 
  10.  */  
  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ù),一是可以實(shí)現(xiàn)數(shù)據(jù)的持久化,在MVC模式中很是有用;二是可以對象數(shù)據(jù)的遠(yuǎn)程通信。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多