標籤:程式 ext 資訊 還原序列化 運行 ref 構造參數 建立 font
轉載請註明原文地址:http://www.cnblogs.com/ygj0930/p/6574920.html
一:序列化與還原序列化
序列化:把Java對象轉化為位元組序列的過程;
還原序列化:從位元組序列重構出Java對象的過程。
二:序列化的作用
1)對象持久化:我們知道,對象隨著程式的運行而被建立,然後在不可達時被回收,生命週期是短暫的。但是如果我們想長久地把對象的內容儲存起來怎麼辦呢?把它轉化為位元組序列儲存在儲存介質上即可。那就需要序列化。
2)網路傳輸對象:我們知道,兩個進程之間通訊時,傳遞的音頻、視頻等資訊是以二進位序列形式來傳輸的。那麼,對象也可以嗎?可以,通過序列化把主機A進程上的對象序列化為二進位序列,傳輸到主機B上的進程從序列中重構出該對象。這在RMI中應用廣泛,RMI的結果可以是一個對象。
三:Java序列化對象的方式
1:Java序列化的預設API
通過 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序列化的特殊情況
六:其他序列化手段
Java序列化與還原序列化