天天看點

教你快速實作類對象的序列化/反序列化 | 帶你學《Java語言進階特性》之七十

上一篇:使用Serializable實作類對象序列化能力 | 帶你學《Java語言進階特性》之六十九

上一節中我們通過在類中實作Serializable聲明該類能夠序列化,本節将帶領讀者借助ObjectOutputStream類和ObjectInputStream類實作對象的序列化和反序列化。

【本節目标】

通過閱讀本節内容,你将了解到ObjectOutputStream類和ObjectInputStream類的定義、相關方法等内容,并結合執行個體實作對類對象的序列化輸出和反序列化讀取的操作,同時了解其使用方面的部分限制。

序列化與反序列化處理

有了序列化的支援類後,如果想要實作序列化和反序列化操作則可以利用以下兩個類完成。

序列化:ObjectOutputStream:

類定義:public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants

構造方法:
    public ObjectOutputStream(OutputStream out) throws IOException
操作方法:
    public final void writeObject(Object obj) throws IOException           

反序列化:ObjectInputStream:

類定義:public class ObjectInputStream extends InputStream implements ObjectInput,ObjectStreamConstants

構造方法:
    public ObjectInputStream(InputStream in) throws IOException
操作方法:
    public final Object readObject() throws IOException, ClassNotFoundException           

範例:實作序列化與反序列化

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
@SuppressWarnings("serial")
class Person implements Serializable {//Person類可以被序列化
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "姓名:" + this.name + "、年齡:" + this.age;
    }
}
public class JavaAPIDemo {
    private static final File SAVE_FILE=new File("D:" + File.separator + "mldn.person");
    public static void main(String[] args) throws Exception {
        //saveObject(new Person("小噴嚏",78));
        System.out.println(loadObject());
    }
    public static void saveObject(Object obj)throws Exception{
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(SAVE_FILE));
        oos.writeObject(obj);  //序列化
        oos.close();
    }
    public static Object loadObject()throws Exception{
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream(SAVE_FILE));
        Object obj= ois.readObject();   //反序列化
        ois.close();
        return obj;
    }
}           

在Java中的對象序列化與反序列化必須使用内部提供的對象操作流,因為這裡面牽扯到了二進制資料的格式,是以不能自定義處理,另外如果要想實作一組對象的序列化,則可以使用對象數組完成。

在很多的實際項目開發過程之中,開發者很少能見到ObjectOutputStream、ObjectInputStream類的直接操作,因為會有一些容器幫助開發者自動實作。

想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。

本内容視訊來源于

阿裡雲大學 下一篇:transient:将屬性脫離序列化 | 帶你學《Java語言進階特性》之七十一 更多Java面向對象程式設計文章檢視此處