天天看點

java中對象的串行化(Serialization)

一、 串行化的定義

  1. 什麼是串行化

  對象的壽命通常随着生成該對象的 程式 的終止而終止。有時候,可能需要将對象的狀态儲存下來,在需要時再将對象恢複。我們把對象的這種能記錄自己的狀态以便将來再生的 能力 ,叫做對象的持續性(persistence)。對象通過寫出描述自己狀态的數值來記錄自己,這個過程叫對象的串行化(Serialization)。

  2. 串行化的目的

  串行化的目的是為 java 的運作環境提供一組特性,其主要任務是寫出對象執行個體變量的數值。

二、串行化方法

  在java.io包中,接口Serializable用來作為實作對象串行化的工具,隻有實作了Serializable的類的對象才可以被串行化。

  1. 定義一個可串行化對象

  public class Student implements Serializable{

    int id; //學号

    String name; //姓名

    int age; //年齡

    String department //系别

    public Student(int id,String name,int age,String department){

     this.id = id;

     this.name = name;

     this.age = age;

     this.department = department;

    }

  }

  2. 構造對象的輸入/輸出流

  要串行化一個對象,必須與一定的對象輸入/輸出流聯系起來,通過對象輸出流将對象狀态儲存下來,再通過對象輸入流将對象狀态恢複。

  java.io包中,提供了ObjectInputStream和ObjectOutputStream将資料流功能 擴充 至可讀寫對象。在ObjectInputStream中用readObject()方法可以直接讀取一個對象,ObjectOutputStream中用writeObject()方法可以直接将對象儲存到輸出流中。

Student stu=new Student(981036,"Liu Ming",18, "CSD");

  FileOutputStream fo=new FileOutputStream("data.ser");

  //儲存對象的狀态

  ObjectOutputStream so=new ObjectOutputStream(fo);

  try{

    so.writeObject(stu);

    so.close();

    }catch(IOException e )

      {System.out.println(e);}

  FileInputStream fi=new FileInputStream("data.ser");

  ObjectInputStream si=new ObjectInputStream(fi);

  //恢複對象的狀态

  try{

    stu=(Student)si.readObject();

    si.close();

    }catch(IOException e )

  {System.out.println(e);}

  在這個例子中,我們首先定義一個類Student,實作了 Serializable接口,然後通過對象輸出流的writeObject()方法将Student對象儲存到檔案data.ser中。之後,通過對象輸入流的readObject()方法從檔案data.ser中讀出儲存下來的Student對象。

三、串行化的注意事項

  1.串行化能儲存的元素

  隻能儲存對象的非靜态成員變量,不能儲存任何的成員方法和靜态的成員變量,而且串行化儲存的隻是變量的值,對于變量的任何修飾符,都不能儲存。

  2.transient關鍵字

 

  對于某些類型的對象,其狀态是瞬時的,這樣的對象是無法儲存其狀态的,例如一個Thread對象,或一個FileInputStream對象,對于這些字段,我們必須用transient關鍵字标明

  3. 定制串行化

  預設的串行化機制,對象串行化首先寫入類 資料 和類字段的資訊,然後按照名稱的上升排列順序寫入其數值。如果想自己明确地控制這些數值的寫入順序和寫入種類,必須定義自己的讀取資料流的方式。就是在類的定義中重寫writeObject()和readObject()方法。

  例如可在4.8.2的例子中,加入重寫的writeObject()和readObject()方法,對Student 類定制其串行化。

  private void writeObject(ObjectOutputStream out)throws IOException

  {

    out.writeInt(id);

    out.writeInt(age);

    out.writeUTF(name);

    out.writeUTF(department);

  }

  private void readObject(ObjectInputStream in)throws IOException

  {

    id=in.readInt();

    age=in.readInt();

    name=in.readUTF();

    department=in.readUTF();

  }