Java序列化與反序列化

轉載請註明原文地址:http://www.cnblogs.com/ygj0930/p/6574920.html html

    一:序列化與反序列化java

    序列化:把Java對象(動態的狀態,如變量、函數)轉化爲字節序列的過程;網絡

    反序列化:從字節序列重構出Java對象的過程。函數

    二:序列化的做用加密

    1)對象持久化:咱們知道,對象隨着程序的運行而被建立,而後在不可達時被回收,生命週期是短暫的。可是若是咱們想長久地把對象的內容保存起來怎麼辦呢?把它轉化爲字節序列保存在存儲介質上便可。那就須要序列化。spa

    2)網絡傳輸對象:咱們知道,兩個進程之間通訊時,傳遞的音頻、視頻等信息是以二進制序列形式來傳輸的。那麼,對象也能夠嗎?能夠,經過序列化把主機A進程上的對象序列化爲二進制序列,傳輸到主機B上的進程從序列中重構出該對象。這在RMI中應用普遍,RMI的結果能夠是一個對象。插件

    三:Java序列化對象的方式視頻

    1:Java序列化的默認APIhtm

       經過 java.io.ObjectOutputStream(對象輸出流)writeObject(Object obj)方法能夠對參數的obj對象進行序列化,把獲得的字節序列寫到一個該輸出流中。對象

       經過 java.io.ObjectInputStream(對象輸入流)的 readObject()方法源輸入流中讀取字節序列,再把它們反序列化成爲一個對象並將其返回,返回時經過強制類型轉換賦值給具體的類對象引用。(根據這個類的信息來解讀二進制序列從而重構對象)。

     2:讓對象能夠被序列化的三種方式

        1)默認序列化:定義類時實現Serializable接口便可,這個Serializable接口是一個空接口,沒有須要實現的方法。做用是標記該類的對象能夠被序列化,啓用其序列化功能。經過調用 ObjectOutputStream和ObjectInputStream的方法來對該對象進行序列化和反序列化。

        2)類自定義序列化:定義類時,實現Serializable接口,並在類中定義

private void writeObject(java.io.ObjectOutputStream out)
     throws IOException
 private void readObject(java.io.ObjectInputStream in)
     throws IOException, ClassNotFoundException;
   
     這兩個方法,在方法中經過對象輸入流參數、對象輸出流參數進行自定義的內容輸出。這樣經過對象輸出流和對象輸入流的輸入輸出方法序列化和反序列化對象時會自動調用類中定義的writeObject、
和readObject方法而不是默認的序列化和反序列化方法。

3)類自定義序列化方式二:實現Externalnalizable接口,而且在類中實現readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法,在方法中定義類對象自定義
的序列化和反序列化操做。
這樣經過對象輸出流和對象輸入流的輸入輸出方法序列化和反序列化對象時會自動調用類中定義readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法。

四:序列化和反序列化的使用步驟
1:建立類,實現Serializable接口或者Externalizable接口,實現相應的序列化和反序列化方法(也可採起默認方法);
2:在程序代碼中建立對象後,建立對象輸出流ObjectOutputStream對象並在構造參數中指定流的輸出目標(好比一個文件),經過objectOutputStream.writeObject(obj)把對象序列化並輸出到流目標處;
3:在須要提取對象處:建立對象輸入流ObjectInputStream對象並在構造參數中指定流的來源,而後經過readObject()方法獲取對象,並經過強制類型轉換賦值給類對象引用

    五:Java序列化的特殊狀況

        1:靜態變量和transient關鍵字修飾的變量不能被序列化;

        2:反序列化時要按照序列化的順序重構對象:如先序列化A後序列化B,則反序列化時也要先獲取A後獲取B,不然報錯。

        3:序列化ID的做用:虛擬機是否容許對象反序列化,不只取決於該對象所屬類路徑和功能代碼是否與虛擬機加載的類一致,而是主要取決於對象所屬類與虛擬機加載的該類的序列化 ID 是否一致

        4:自定義序列化方法的應用場景:對某些敏感數據進行加密操做後再序列化;反序列化對加密數據進行解密操做。

        5:重複序列化:同一個對象重複序列化時,不會把對象內容再次序列化,而是新增一個引用指向第一次序列化時的對象而已。

    六:其餘序列化手段

        1:把對象包裝成JSON格式進行序列化

        2:用XML格式序列化

        3:採用第三方插件(如:ProtoBuf)進行序列化

相關文章
相關標籤/搜索