posts - 122,  comments - 25,  trackbacks - 0

          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ì)象:

          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é)就是用來描述序列化以后的TestClassSerial對(duì)象的,我們注意到 TestSerial 類中只有兩個(gè)域:

          1 public  byte version = 100;
          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

          posted on 2010-12-16 14:52 josson 閱讀(820) 評(píng)論(0)  編輯  收藏 所屬分類: java 開發(fā)
          <2010年12月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          收藏夾

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 北票市| 璧山县| 石楼县| 景谷| 满洲里市| 确山县| 碌曲县| 改则县| 昭平县| 盐津县| 湾仔区| 郁南县| 沂源县| 汉阴县| 原阳县| 千阳县| 罗田县| 阿拉尔市| 泰安市| 天气| 南江县| 鄂伦春自治旗| 玛多县| 宣化县| 开化县| 西华县| 宣汉县| 千阳县| 景泰县| 汾阳市| 孝义市| 三河市| 伊宁市| 共和县| 日喀则市| 平顶山市| 汤阴县| 锡林浩特市| 炎陵县| 翼城县| 大关县|