Java序列化的機制和原理_第1頁
Java序列化的機制和原理_第2頁
Java序列化的機制和原理_第3頁
Java序列化的機制和原理_第4頁
Java序列化的機制和原理_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Java序列化的機制和原理有關Java對象的序列化和反序列化也算是Java基礎的一部分,下面對Java序列化的機制和原理進行一些介紹。Java序列化算法透析Serialization(序列化)是一種將對象以一連串的字節(jié)描述的過程;反序列化deserialization是一種將這些字節(jié)重建成一個對象的過程。Java序列化API提供一種處理對象序列化的標準機制。在這里你能學到如何序列化一個對象,什么時候需要序列化以及Java序列化的算法,我們用一個實例來示范序列化以后的字節(jié)是如何描述一個對象的信息的。序列化的必要性Java中,一切都是對象,在分布式環(huán)境中經常需要將Object從這一端網絡或設備傳遞

2、到另一端。這就需要有一種可以在兩端傳輸數據的協(xié)議。Java序列化機制就是為了解決這個問題而產生。如何序列化一個對象一個對象能夠序列化的前提是實現(xiàn)Serializable接口,Serializable接口沒有方法,更像是個標記。有了這個標記的Class就能被序列化機制處理。1. import java.io.Serializable;  2.  3. class TestSerial implements Serializable   4.  5.      

3、;  public byte version = 100;  6.  7.        public byte count = 0;  8.  9.  然后我們寫個程序將對象序列化并輸出。ObjectOutputStream能把Object輸出成Byte流。我們將Byte流暫時存儲到temp.out文件里。1. public static void

4、0;main(String args) throws IOException   2.  3.        FileOutputStream fos = new FileOutputStream("temp.out");  4.  5.        ObjectOutputStream oos 

5、= new ObjectOutputStream(fos);  6.  7.        TestSerial ts = new TestSerial();  8.  9.        oos.writeObject(ts);  10.  11.        oo

6、s.flush();  12.  13.        oos.close();  14.  15.  如果要從持久的文件中讀取Bytes重建對象,我們可以使用ObjectInputStream。  1. public static void main(String args) throws IOException   2.  3.    

7、;    FileInputStream fis = new FileInputStream("temp.out");  4.  5.        ObjectInputStream oin = new ObjectInputStream(fis);  6.  7.       

8、0;TestSerial ts = (TestSerial) oin.readObject();  8.  9.        System.out.println("version="+ts.version);  10.  11.  執(zhí)行結果為100.對象的序列化格式將一個對象序列化后是什么樣子呢?打開剛才我們將對象序列化輸出的temp.out文件,以16進制方式顯示。內容應該如下:AC ED 00 05 73 7

9、2 00 0A 53 65 72 69 61 6C 54 6573 74 A0 0C 34 00 FE B1 DD F9 02 00 02 42 00 0563 6F 75 6E 74 42 00 07 76 65 72 73 69 6F 6E 7870 00 64這一坨字節(jié)就是用來描述序列化以后的TestSerial對象的,我們注意到TestSerial類中只有兩個域:public byte version = 100;public byte count = 0;且都是byte型,理論上存儲這兩個域只需要2個byte,但是實際上temp.out占據空間為51bytes,也

10、就是說除了數據以外,還包括了對序列化對象的其他描述。Java的序列化算法序列化算法一般會按步驟做如下事情:將對象實例相關的類元數據輸出。遞歸地輸出類的超類描述直到不再有超類。類元數據完了以后,開始從最頂層的超類開始輸出對象實例的實際數據值。從上至下遞歸輸出實例的數據我們用另一個更完整覆蓋所有可能出現(xiàn)的情況的例子來說明:1. class parent implements Serializable   2.  3.        int parentVers

11、ion = 10;  4.  5.  6.  7.    8.  9. class contain implements Serializable  10.  11.        int containVersion = 11;  12.  13.  14.  15. public class S

12、erialTest extends parent implements Serializable   16.  17.        int version = 66;  18.  19.        contain con = new contain();  20.  21.

13、    22.  23.        public int getVersion()   24.  25.               return version;  26.  27.         &#

14、160;28.  29.        public static void main(String args) throws IOException   30.  31.               FileOutputStream fos = new

15、60;FileOutputStream("temp.out");  32.  33.               ObjectOutputStream oos = new ObjectOutputStream(fos);  34.  35.           

16、;    SerialTest st = new SerialTest();  36.  37.               oos.writeObject(st);  38.  39.             

17、0; oos.flush();  40.  41.               oos.close();  42.  43.          44.  45.  這個例子是相當的直白啦。SerialTest類實現(xiàn)了Parent超類,內部還持有一個Container對象。序列化后的格式如下:AC ED 00

18、05 73 72 00 0A 53 65 72 69 61 6C 54 6573 74 05 52 81 5A AC 66 02 F6 02 00 02 49 00 0776 65 72 73 69 6F 6E 4C 00 03 63 6F 6E 74 00 094C 63 6F 6E 74 61 69 6E 3B 78 72 00 06 70 61 7265 6E 74 0E DB D2 BD 85 EE 63 7A 02 00 01 49 000D 70 61 72 65 6E 74 56 65 72 73 6

19、9 6F 6E 78 7000 00 00 0A 00 00 00 42 73 72 00 07 63 6F 6E 7461 69 6E FC BB E6 0E FB CB 60 C7 02 00 01 49 000E 63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E 7870 00 00 00 0B我們來仔細看看這些字節(jié)都代表了啥。開頭部分,見顏色:1. AC ED: STREAM_MAGIC. 聲明使用了序列化協(xié)議.2. 00

20、05: STREAM_VERSION. 序列化協(xié)議版本.3. 0x73: TC_OBJECT. 聲明這是一個新的對象.  序列化算法的第一步就是輸出對象相關類的描述。例子所示對象為SerialTest類實例,因此接下來輸出SerialTest類的描述。見顏色:1. 0x72: TC_CLASSDESC. 聲明這里開始一個新Class。2. 00 0A: Class名字的長度.3. 53 65 72 69 61 6c 54 65 73 74: SerialTest,Class類名.4. 05 52 81 5A AC 66 02 F6:&

21、#160;SerialVersionUID, 序列化ID,如果沒有指定,則會由算法隨機生成一個8byte的ID.5. 0x02: 標記號. 該值聲明該對象支持序列化。6. 00 02: 該類所包含的域個數。接下來,算法輸出其中的一個域,int version=66;見顏色:1. 0x49: 域類型. 49 代表"I", 也就是Int.2. 00 07: 域名字的長度.3. 76 65 72 73 69 6F 6E: version,域名字描述.然后,算法輸出下一個域,contain c

22、on = new contain();這個有點特殊,是個對象。描述對象類型引用時需要使用JVM的標準對象簽名表示法,見顏色:1. 0x4C: 域的類型.2. 00 03: 域名字長度.3. 63 6F 6E: 域名字描述,con4. 0x74: TC_STRING. 代表一個new String.用String來引用對象。5. 00 09: 該String長度.6. 4C 63 6F 6E 74 61 69 6E 3B: Lcontain;, JVM的標準對象簽名表示法.7. 0x78: TC_ENDBLOCKDATA,對象數據塊結束

23、的標志.接下來算法就會輸出超類也就是Parent類描述了,見顏色:1. 0x72: TC_CLASSDESC. 聲明這個是個新類.2. 00 06: 類名長度.3. 70 61 72 65 6E 74: parent,類名描述。4. 0E DB D2 BD 85 EE 63 7A: SerialVersionUID, 序列化ID.5. 0x02: 標記號. 該值聲明該對象支持序列化.6. 00 01: 類中域的個數.下一步,輸出parent類的域描述,int parentVersion=100;同見顏色:1. 0x

24、49: 域類型. 49 代表"I", 也就是Int.2. 00 0D: 域名字長度.3. 70 61 72 65 6E 74 56 65 72 73 69 6F 6E: parentVersion,域名字描述。4. 0x78: TC_ENDBLOCKDATA,對象塊結束的標志。5. 0x70: TC_NULL, 說明沒有其他超類的標志。.到此為止,算法已經對所有的類的描述都做了輸出。下一步就是把實例對象的實際值輸出了。這時候是從parent Class的域開始的,見顏色:1. 00 00 00 0A: 10, parentVersion域的值.還有SerialTest類的域:1. 00 0

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論