1、什么是java序列化
Java
序列化
API
提供一種處理對(duì)象序列化的標(biāo)準(zhǔn)機(jī)制。序列化(Serialization)是指將java對(duì)象用一連串字節(jié)描述的一個(gè)過(guò)程;反序列化(deserialization)是一種將這一串字節(jié)構(gòu)建成一個(gè)對(duì)象的過(guò)程。
2、序列化的作用(必要性)
Java中,一切都是對(duì)象,在分布式環(huán)境中經(jīng)常需要將對(duì)象從這一端網(wǎng)絡(luò)或設(shè)備傳遞到另一端。Java
序列化機(jī)制就是一種解決在網(wǎng)絡(luò)兩端傳輸數(shù)據(jù)的問(wèn)題而產(chǎn)生的協(xié)議。下圖表示客戶(hù)端/服務(wù)器之間通信,一個(gè)對(duì)象是從客戶(hù)端傳送到服務(wù)器通過(guò)序列化的視圖。

3、如何序列化一個(gè)對(duì)象
為序列化一個(gè)對(duì)象,你需確保對(duì)象類(lèi)實(shí)現(xiàn)Serializable接口。Serializable接口沒(méi)有方法,只要實(shí)現(xiàn)了序列化接口,Class
就能被序列化機(jī)制處理。
示例代碼,需序列化的java對(duì)象:
1 import java.io.Serializable;
2
3 public class TestClassSerial implements Serializable {
4 public byte version = 100;
5 public byte count = 0;
6 }
示例代碼,
把TestClassSerial對(duì)照象
輸出成
Byte
流,存儲(chǔ)到
temp.out
文件里:
1 public static void main(String args[]) throws IOException {
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ì)象:
1 public static void main1(String args[]) throws IOException {
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)容如下:
AC ED 00 05 73 72 00 0A 53 65 72 69 61 6C 54 65
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é)就是用來(lái)描述序列化以后的TestClassSerial對(duì)象的,我們注意到
TestSerial
類(lèi)中只有兩個(gè)域:
1 public byte version = 100;
2 public byte count = 0;
都是
byte
型,理論上存儲(chǔ)這兩個(gè)域只需要
2
個(gè)
byte
,但是實(shí)際上
temp.out
占據(jù)空間為
51bytes
,也就是說(shuō)除了數(shù)據(jù)以外,還包括了對(duì)序列化對(duì)象的其他描述。
5、Java
的序列化算法
序列化算法一般會(huì)按步驟做如下事情:
1、將對(duì)象實(shí)例相關(guān)的類(lèi)的元數(shù)據(jù)輸出;
2、遞歸地輸出類(lèi)的超類(lèi)元數(shù)據(jù)描述直到不再有超類(lèi);
3、類(lèi)元數(shù)據(jù)完了以后,開(kāi)始從最頂層的超類(lèi)開(kāi)始輸出對(duì)象實(shí)例的實(shí)際數(shù)據(jù)值;
4、從上至下遞歸輸出實(shí)例的數(shù)據(jù);
更多序例化事例及二進(jìn)制字節(jié)含義參考文檔:http://my.oschina.net/god/blog/1291
posted on 2010-12-16 14:52
josson 閱讀(825)
評(píng)論(0) 編輯 收藏 所屬分類(lèi):
java 開(kāi)發(fā)