Java基礎之序列化詳解

相關定義及用途

java序列化(又叫串行化)技術可以使你將一個對象的狀態寫入一個Byte流裏,並且可以從其他地方把該Byte流裏的數據讀出來,重新構造一個相同的對象。這種機制允許你將對象通過網絡進行傳播,並可以隨時把對象持久化到數據庫、文件等系統裏。java的序列化機制是RMI(遠程方法調用)、EFB等技術的技術基礎。

用途:利用對象的序列化實現保存應用程序的當前工作狀態,下次再啓動的是時候將自動恢復到上次執行的狀態。

序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。可以對流化後的對象進行讀寫操作,也可將流化後的對象傳輸於網絡之間。序列化是爲了解決在對對象流進行讀寫操作時所引發的問題。

實現方法及其特點

實現方法:將需要被序列化的類實現Serializable接口,然後使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutpotStream(對象流)對象,接着,使用ObjectOutputtream對象的writeObject(Object obj)方法就可以將參數爲obj的對象寫出(即保存其狀態),要恢復的話則用輸入流。

序列化的特點:

  • 如果某個類能夠序列化,其子類也可以被序列化。如果該類有父類,則分兩種情況來考慮,如果該父類已經實現了可序列化接口。則其父類的相應字段及屬性的處理與該類相同;如果該類的父類沒有實現可序列化接口,則該類的父類所有的字段屬性將不會被序列化。
  • 聲明爲static和transient類型的成員數據不能被序列化。因爲static代表類的狀態,transient代表對象的臨時數據。
  • 相關的雷和接口:在java.io包中提供的設計對象的序列化的類與接口有ObjectOutput接口,ObjectOutputStream類,ObjectInput接口,ObjectInputStream類。

ObjectOutput接口:繼承DataOutput接口並且支持對象的序列化,其內的writeObject()方法實現存儲一個對象。
ObjectInput接口:繼承DataInput接口並且支持對象的序列化,其內的readObject()方法實現讀取一個對象。
ObjectOutputStream類:繼承OutputStram類並實現ObjectOutput接口。利用該類來實現對象存儲。
ObjectInputStream類:繼承InputStram類並實現ObjectInput接口。利用該類來實現讀取一個對象。

對於父類的處理:

如果父類沒有實現序列化接口,則其必須有默認的構造函數(即無參的構造函數)。否則編譯的時候會報錯。因爲在反序列化時,默認狗仔函數會被調用。而java對序列化的對象進行反序列化時,直接從流裏獲取對象數據來生成一個對象實例,而不是通過構造函數來完成。

一個序列化對象的例子:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;


@SuppressWarnings("serial")
public class Person implements Serializable{

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public static void main(String[] args) {
        Person person = new Person();
        person.setName("sjs");
        person.setAge(20);
        try {
            FileOutputStream fos = new FileOutputStream("sjs.out");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(person);
            oos.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            FileInputStream fis = new FileInputStream("sjs.out");
            ObjectInputStream ois = new ObjectInputStream(fis);
            Person p = (Person)ois.readObject();
            System.out.println(p.getName());
            System.out.println(p.getAge());
            ois.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

運行結果:
這裏寫圖片描述

序列化在安卓開發還是挺實用的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章