1、什么是java序列化
Java 序列化 API 提供一種處理對(duì)象序列化的標(biāo)準(zhǔn)機(jī)制。序列化(Serialization)是指將java對(duì)象用一連串字節(jié)描述的一個(gè)過程;反序列化(deserialization)是一種將這一串字節(jié)構(gòu)建成一個(gè)對(duì)象的過程。
2、序列化的作用(必要性)
Java中,一切都是對(duì)象,在分布式環(huán)境中經(jīng)常需要將對(duì)象從這一端網(wǎng)絡(luò)或設(shè)備傳遞到另一端。Java 序列化機(jī)制就是一種解決在網(wǎng)絡(luò)兩端傳輸數(shù)據(jù)的問題而產(chǎn)生的協(xié)議。下圖表示客戶端/服務(wù)器之間通信,一個(gè)對(duì)象是從客戶端傳送到服務(wù)器通過序列化的視圖。
3、如何序列化一個(gè)對(duì)象
為序列化一個(gè)對(duì)象,你需確保對(duì)象類實(shí)現(xiàn)Serializable接口。Serializable接口沒有方法,只要實(shí)現(xiàn)了序列化接口,Class 就能被序列化機(jī)制處理。
示例代碼,需序列化的java對(duì)象:
2
3 public class TestClassSerial implements Serializable {
4 public byte version = 100;
5 public byte count = 0;
6 }
示例代碼,把TestClassSerial對(duì)照象輸出成 Byte 流,存儲(chǔ)到 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 重建對(duì)象:
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 }
執(zhí)行結(jié)果為:100.
4、對(duì)象的序列化格式
TestClassSerial對(duì)象序列化輸出的 temp.out 文件,以 16 進(jìn)制方式顯示,內(nèi)容如下:
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
這些二進(jìn)制字節(jié)就是用來描述序列化以后的TestClassSerial對(duì)象的,我們注意到
TestSerial
類中只有兩個(gè)域:
2 public byte count = 0;
都是 byte 型,理論上存儲(chǔ)這兩個(gè)域只需要 2 個(gè) byte ,但是實(shí)際上 temp.out 占據(jù)空間為 51bytes ,也就是說除了數(shù)據(jù)以外,還包括了對(duì)序列化對(duì)象的其他描述。
5、Java 的序列化算法
序列化算法一般會(huì)按步驟做如下事情:
1、將對(duì)象實(shí)例相關(guān)的類的元數(shù)據(jù)輸出;
2、遞歸地輸出類的超類元數(shù)據(jù)描述直到不再有超類;
3、類元數(shù)據(jù)完了以后,開始從最頂層的超類開始輸出對(duì)象實(shí)例的實(shí)際數(shù)據(jù)值;
4、從上至下遞歸輸出實(shí)例的數(shù)據(jù);
更多序例化事例及二進(jìn)制字節(jié)含義參考文檔:http://my.oschina.net/god/blog/1291