對象序列化的需求最早是爲了能夠在網絡上傳輸對象,傳統的各種類型的數據都是以二進制序列的形式在網上傳送的。如果想在網絡上發送Java對象,就需要把這個Java對象轉換爲字節序列,才能在網絡上傳送,然後接收方在接到數據後再將字節序列恢復爲Java對象即可。
- ObjectOutputStream和ObjectInputStream類
java.io.ObjectOutputStream代表對象輸出流,它的writeObject(Object obj)方法可對參數指定的obj對象進行序列化,把得到的字節序列寫到一個目標輸出流中。
java.io.ObjectInputStream代表對象輸入流,它的readObject( )方法從一個源輸入流中讀取字節序列,再把它們反序列化爲一個對象,並將其返回。
- Serializable和Externalizable接口
只有實現了Seriazable和Externalizable接口的類的對象才能被序列化。Externalizable接口繼承自Serializable接口,實現Externalizable接口的類完全由自身來控制序列化的行爲,而僅實現Serializable接口的類可以採用默認的序列化方式。
序列化主要是用於兩方面:
- RMI,遠程傳遞對象
- 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();
}
}
}