华南俳烁实业有限公司

java

當(dāng)前位置:中華考試網(wǎng) >> java >> java教程 >> 文章內(nèi)容

Java序列化

來(lái)源:中華考試網(wǎng)  [2020年11月4日]  【

  一、Java 序列化

  Java 提供了一種對(duì)象序列化的機(jī)制,該機(jī)制中,一個(gè)對(duì)象可以被表示為一個(gè)字節(jié)序列,該字節(jié)序列包括該對(duì)象的數(shù)據(jù)、有關(guān)對(duì)象的類型的信息和存儲(chǔ)在對(duì)象中數(shù)據(jù)的類型。

  將序列化對(duì)象寫入文件之后,可以從文件中讀取出來(lái),并且對(duì)它進(jìn)行反序列化,也就是說(shuō),對(duì)象的類型信息、對(duì)象的數(shù)據(jù),還有對(duì)象中的數(shù)據(jù)類型可以用來(lái)在內(nèi)存中新建對(duì)象。

  整個(gè)過(guò)程都是 Java 虛擬機(jī)(JVM)獨(dú)立的,也就是說(shuō),在一個(gè)平臺(tái)上序列化的對(duì)象可以在另一個(gè)完全不同的平臺(tái)上反序列化該對(duì)象。

  類 ObjectInputStream 和 ObjectOutputStream 是高層次的數(shù)據(jù)流,它們包含反序列化和序列化對(duì)象的方法。

  ObjectOutputStream 類包含很多寫方法來(lái)寫各種數(shù)據(jù)類型,但是一個(gè)特別的方法例外:

  public final void writeObject(Object x) throws IOException

  上面的方法序列化一個(gè)對(duì)象,并將它發(fā)送到輸出流。相似的 ObjectInputStream 類包含如下反序列化一個(gè)對(duì)象的方法:

  public final Object readObject() throws IOException, ClassNotFoundException

  該方法從流中取出下一個(gè)對(duì)象,并將對(duì)象反序列化。它的返回值為Object,因此,你需要將它轉(zhuǎn)換成合適的數(shù)據(jù)類型。

  為了演示序列化在Java中是怎樣工作的,我將使用之前教程中提到的Employee類,假設(shè)我們定義了如下的Employee類,該類實(shí)現(xiàn)了Serializable 接口。

  Employee.java 文件代碼:

  public class Employee implements java.io.Serializable {

  public String name;

  public String address;

  public transient int SSN;

  public int number;

  public void mailCheck() {

  System.out.println("Mailing a check to " + name + " " + address);

  } }

  請(qǐng)注意,一個(gè)類的對(duì)象要想序列化成功,必須滿足兩個(gè)條件:

  該類必須實(shí)現(xiàn) java.io.Serializable 對(duì)象。

  該類的所有屬性必須是可序列化的。如果有一個(gè)屬性不是可序列化的,則該屬性必須注明是短暫的。

  如果你想知道一個(gè) Java 標(biāo)準(zhǔn)類是否是可序列化的,請(qǐng)查看該類的文檔。檢驗(yàn)一個(gè)類的實(shí)例是否能序列化十分簡(jiǎn)單, 只需要查看該類有沒(méi)有實(shí)現(xiàn) java.io.Serializable接口。

  二、序列化對(duì)象

  ObjectOutputStream 類用來(lái)序列化一個(gè)對(duì)象,如下的 SerializeDemo 例子實(shí)例化了一個(gè) Employee 對(duì)象,并將該對(duì)象序列化到一個(gè)文件中。

  該程序執(zhí)行后,就創(chuàng)建了一個(gè)名為 employee.ser 文件。該程序沒(méi)有任何輸出,但是你可以通過(guò)代碼研讀來(lái)理解程序的作用。

  填寫下面表單即可預(yù)約申請(qǐng)免費(fèi)試聽(tīng)java課程!害怕學(xué)不會(huì)?助教全程陪讀,隨時(shí)解惑!擔(dān)心就業(yè)?一地學(xué)習(xí),可全國(guó)推薦就業(yè)!

預(yù)約申請(qǐng)免費(fèi)聽(tīng)java課程

  • 地區(qū):
  • 姓名:
  • 手機(jī):

  注意: 當(dāng)序列化一個(gè)對(duì)象到文件時(shí), 按照 Java 的標(biāo)準(zhǔn)約定是給文件一個(gè) .ser 擴(kuò)展名。

  SerializeDemo.java 文件代碼:

  import java.io.*;

  public class SerializeDemo {

  public static void main(String [] args) {

  Employee e = new Employee();

  e.name = "Reyan Ali";

  e.address = "Phokka Kuan, Ambehta Peer";

  e.SSN = 11122333;

  e.number = 101;

  try {

  FileOutputStream fileOut = new FileOutputStream("/tmp/employee.ser");

  ObjectOutputStream out = new ObjectOutputStream(fileOut);

  out.writeObject(e);

  out.close();

  fileOut.close();

  System.out.printf("Serialized data is saved in /tmp/employee.ser");

  }

  catch(IOException i) {

  i.printStackTrace();

  } } }

  三、反序列化對(duì)象

  下面的 DeserializeDemo 程序?qū)嵗朔葱蛄谢?tmp/employee.ser 存儲(chǔ)了 Employee 對(duì)象。

  DeserializeDemo.java 文件代碼:

  import java.io.*;

  public class DeserializeDemo {

  public static void main(String [] args) {

  Employee e = null;

  try {

  FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");

  ObjectInputStream in = new ObjectInputStream(fileIn);

  e = (Employee) in.readObject();

  in.close();

  fileIn.close();

  }

  catch(IOException i) {

  i.printStackTrace();

  return;

  }

  catch(ClassNotFoundException c) {

  System.out.println("Employee class not found");

  c.printStackTrace();

  return;

  }

  System.out.println("Deserialized Employee...");

  System.out.println("Name: " + e.name);

  System.out.println("Address: " + e.address);

  System.out.println("SSN: " + e.SSN);

  System.out.println("Number: " + e.number);

  } }

  以上程序編譯運(yùn)行結(jié)果如下所示:

  Deserialized Employee...

  Name: Reyan Ali

  Address:Phokka Kuan, Ambehta Peer

  SSN: 0

  Number:101

  這里要注意以下要點(diǎn):

  readObject() 方法中的 try/catch代碼塊嘗試捕獲 ClassNotFoundException 異常。對(duì)于 JVM 可以反序列化對(duì)象,它必須是能夠找到字節(jié)碼的類。如果JVM在反序列化對(duì)象的過(guò)程中找不到該類,則拋出一個(gè) ClassNotFoundException 異常。

  注意,readObject() 方法的返回值被轉(zhuǎn)化成 Employee 引用。

  當(dāng)對(duì)象被序列化時(shí),屬性 SSN 的值為 111222333,但是因?yàn)樵搶傩允嵌虝旱,該值沒(méi)有被發(fā)送到輸出流。所以反序列化后 Employee 對(duì)象的 SSN 屬性為 0。

責(zé)編:fushihao
  • 會(huì)計(jì)考試
  • 建筑工程
  • 職業(yè)資格
  • 醫(yī)藥考試
  • 外語(yǔ)考試
  • 學(xué)歷考試
新竹县| 张家口市| 庄浪县| 土默特左旗| 兴海县| 宣汉县| 松江区| 岚皋县| 苍梧县| 介休市| 县级市| 喀喇沁旗| 诸城市| 江门市| 山阳县| 昌图县| 含山县| 上虞市| 东海县| 陆川县| 三门峡市| 荣昌县| 綦江县| 丰都县| 开平市| 惠州市| 武穴市| 资溪县| 内乡县| 衡山县| 临江市| 井陉县| 东光县| 桂平市| 博湖县| 横山县| 临澧县| 凉山| 林口县| 石棉县| 罗定市|