1、什么是java序列化
Java 序列化 API 提供一種處理對象序列化的標準機制。序列化(Serialization)是指將java對象用一連串字節描述的一個過程;反序列化(deserialization)是一種將這一串字節構建成一個對象的過程。
2、序列化的作用(必要性)
Java中,一切都是對象,在分布式環境中經常需要將對象從這一端網絡或設備傳遞到另一端。Java 序列化機制就是一種解決在網絡兩端傳輸數據的問題而產生的協議。下圖表示客戶端/服務器之間通信,一個對象是從客戶端傳送到服務器通過序列化的視圖。
3、如何序列化一個對象
為序列化一個對象,你需確保對象類實現Serializable接口。Serializable接口沒有方法,只要實現了序列化接口,Class 就能被序列化機制處理。
示例代碼,需序列化的java對象:
2
3 public class TestClassSerial implements Serializable {
4 public byte version = 100;
5 public byte count = 0;
6 }
示例代碼,把TestClassSerial對照象輸出成 Byte 流,存儲到 temp.out 文件里:
2 FileOutputStream fos = null;
3 ObjectOutputStream oos = null;
4 try {
5 fos = new FileOutputStream("c:/temp.out");
6 oos = new ObjectOutputStream(fos);
7 TestClassSerial tcs = new TestClassSerial();
8 oos.writeObject(tcs);
9 oos.flush();
10 }
11 finally {
12 if(oos != null) {
13 oos.close();
14 }
15 if(fos != null) {
16 fos.close();
17 }
18 }
19 }
示例代碼,從持久的文件中讀取 Bytes 重建對象:
2 FileInputStream fis = null;
3 ObjectInputStream oin = null;
4 try {
5 fis = new FileInputStream("c:/temp.out");
6 oin = new ObjectInputStream(fis);
7 TestClassSerial tcs = (TestClassSerial) oin.readObject();
8 System.out.println("version="+tcs.version);
9 }
10 finally {
11 if(fis != null) {
12 fis.close();
13 }
14 if(oin != null) {
15 oin.close();
16 }
17 }
18 }
執行結果為:100.
4、對象的序列化格式
TestClassSerial對象序列化輸出的 temp.out 文件,以 16 進制方式顯示,內容如下:
73 74 A0 0C 34 00 FE B1 DD F9 02 00 02 42 00 05
63 6F 75 6E 74 42 00 07 76 65 72 73 69 6F 6E 78
70 00 64
這些二進制字節就是用來描述序列化以后的TestClassSerial對象的,我們注意到
TestSerial
類中只有兩個域:
2 public byte count = 0;
都是 byte 型,理論上存儲這兩個域只需要 2 個 byte ,但是實際上 temp.out 占據空間為 51bytes ,也就是說除了數據以外,還包括了對序列化對象的其他描述。
5、Java 的序列化算法
序列化算法一般會按步驟做如下事情:
1、將對象實例相關的類的元數據輸出;
2、遞歸地輸出類的超類元數據描述直到不再有超類;
3、類元數據完了以后,開始從最頂層的超類開始輸出對象實例的實際數據值;
4、從上至下遞歸輸出實例的數據;
更多序例化事例及二進制字節含義參考文檔:http://my.oschina.net/god/blog/1291