對象序列化

對象序列化的需求最早是爲了能夠在網絡上傳輸對象,傳統的各種類型的數據都是以二進制序列的形式在網上傳送的。如果想在網絡上發送Java對象,就需要把這個Java對象轉換爲字節序列,才能在網絡上傳送,然後接收方在接到數據後再將字節序列恢復爲Java對象即可。
  1. ObjectOutputStream和ObjectInputStream類
java.io.ObjectOutputStream代表對象輸出流,它的writeObject(Object obj)方法可對參數指定的obj對象進行序列化,把得到的字節序列寫到一個目標輸出流中。
java.io.ObjectInputStream代表對象輸入流,它的readObject( )方法從一個源輸入流中讀取字節序列,再把它們反序列化爲一個對象,並將其返回。
  1. Serializable和Externalizable接口
只有實現了Seriazable和Externalizable接口的類的對象才能被序列化。Externalizable接口繼承自Serializable接口,實現Externalizable接口的類完全由自身來控制序列化的行爲,而僅實現Serializable接口的類可以採用默認的序列化方式。
序列化主要是用於兩方面:
  1. RMI,遠程傳遞對象
  2. JavaBean,Bean的狀態信息通常是在設計時配置的。這些狀態信息必須保存起來,供程序啓動的時候用。
Java中實現序列化,只要implements接口即可。

具體步驟如下:
  • 創建一個對象輸出流,它可以包裝一個其他類型的目標輸出流,如文件輸出流;
  • 通過對象輸出流的writeObject( )方法寫對象。
//MakeObjectFile.java
package com.company;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

/**
* Created by jiajie on 2017/2/16.
*/
public class MakeObjectFile implements java.io.Serializable {
    private String str = new String();

    public void setStr(String str) {
        this.str = str;
    }

    public String getStr() {
        return str;
    }

    public static void main(String args[]) {
        try {
            FileOutputStream objfile = new FileOutputStream("makeobj.obj");
            ObjectOutputStream p = new ObjectOutputStream(objfile);
            MakeObjectFile mof = new MakeObjectFile();
            mof.setStr("abcd");
            p.writeObject(mof);
            p.flush();
            objfile.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
運行之後,在目錄中出現了一個新的文件makeobj.obj,這個文件中就存放着這個對象的序列字節。
反序列化差不多,步驟如下:
  • 創建一個對象輸入流,它可以包裝一個其他類型的元輸入流,如文件輸入流;
  • 通過對象輸入流的readObject( )方法讀取對象。
//OpenObjectFile.java
package com.company;

import java.io.FileInputStream;
import java.io.ObjectInputStream;

/**
* Created by jiajie on 2017/2/16.
*/
public class OpenObjectFile {
    public static void main(String args[]) {
        try {
            FileInputStream objfile = new FileInputStream("makeobj.obj");
            ObjectInputStream q = new ObjectInputStream(objfile);

            MakeObjectFile mof = (MakeObjectFile)q.readObject();
            System.out.println(mof.getStr());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章