posts - 122,  comments - 25,  trackbacks - 0

          1、什么是java序列化

          Java 序列化 API 提供一種處理對象序列化的標準機制。序列化Serialization是指將java對象用一連串字節描述的一個過程;反序列化deserialization是一種將這一串字節構建成一個對象的過程。


          2、序列化的作用(必要性)

          Java中,一切都是對象,在分布式環境中經常需要將對象從這一端網絡或設備傳遞到另一端。Java 序列化機制就是一種解決在網絡兩端傳輸數據的問題而產生的協議。下圖表示客戶端/服務器之間通信,一個對象是從客戶端傳送到服務器通過序列化的視圖。


          3、如何序列化一個對象

          為序列化一個對象,你需確保對象類實現Serializable接口。Serializable接口沒有方法,只要實現了序列化接口,Class 就能被序列化機制處理。

          示例代碼,需序列化的java對象:

          1 import java.io.Serializable;
          2 
          3 public class TestClassSerial implements Serializable  {
          4     public byte version = 100;
          5     public byte count = 0;  
          6 }

          示例代碼,TestClassSerial對照象輸出成 Byte 流,存儲到 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 重建對象
           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     }

          執行結果為:100.


          4、對象的序列化格式

          TestClassSerial對象序列化輸出的 temp.out 文件,以 16 進制方式顯示,內容如下:

          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

          這些二進制字節就是用來描述序列化以后的TestClassSerial對象的,我們注意到 TestSerial 類中只有兩個域:

          1 public  byte version = 100;
          2 public byte count = 0;

          都是 byte 型,理論上存儲這兩個域只需要 2 byte ,但是實際上 temp.out 占據空間為 51bytes ,也就是說除了數據以外,還包括了對序列化對象的其他描述。


          5、Java 的序列化算法

          序列化算法一般會按步驟做如下事情:

          1、將對象實例相關的類的元數據輸出;
          2、
          遞歸地輸出類的超類元數據描述直到不再有超類;
          3、
          類元數據完了以后,開始從最頂層的超類開始輸出對象實例的實際數據值;
          4、
          從上至下遞歸輸出實例的數據;


          更多序例化事例及二進制字節含義參考文檔:http://my.oschina.net/god/blog/1291

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

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          收藏夾

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 萍乡市| 手游| 南雄市| 富裕县| 大英县| 东光县| 黄冈市| 泗水县| 怀宁县| 建宁县| 长泰县| 洪江市| 武威市| 蒲江县| 涡阳县| 鱼台县| 津南区| 林周县| 永新县| 施甸县| 寿光市| 吐鲁番市| 丹东市| 澄迈县| 包头市| 嵊州市| 巧家县| 离岛区| 沭阳县| 沾益县| 双柏县| 浦北县| 子长县| 尖扎县| 酒泉市| 昭通市| 永新县| 花莲市| 乌鲁木齐县| 鄂尔多斯市| 沙洋县|