1. 程式人生 > >什麼是java序列化,如何實現java序列化?(寫一個例項)?

什麼是java序列化,如何實現java序列化?(寫一個例項)?

原文地址:http://blog.csdn.net/cselmu9/article/details/41908741

Java 序列化技術可以使你將一個物件的狀態寫入一個Byte 流裡,並且可以從其它地方把該Byte 流裡的資料讀出來,重新構造一個相同的物件。這種機制允許你將物件通過網路進行傳播,並可以隨時把物件持久化到資料庫、檔案等系統裡。Java的序列化機制是RMI、EJB等技術的技術基礎。用途:利用物件的序列化實現儲存應用程式的當前工作狀態,下次再啟動的時候將自動地恢復到上次執行的狀態。

序列化就是一種用來處理物件流的機制,所謂物件流也就是將物件的內容進行流化。可以對流化後的物件進行讀寫操作,也可將流化後的物件傳輸於網路之間。序列化是為了解決在對物件流進行讀寫操作時所引發的問題。

序列化的實現:將需要被序列化的類實現Serializable介面,然後使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(物件流)物件,接著,使用ObjectOutputStream物件的writeObject(Object obj)方法就可以將引數為obj的物件寫出(即儲存其狀態),要恢復的話則用輸入流。

2、序列化的特點:

    (1)如果某個類能夠被序列化,其子類也可以被序列化。如果該類有父類,則分兩種情況來考慮,如果該父類已經實現了可序列化介面。則其父類的相應欄位及屬性的處理和該類相同;如果該類的父類沒有實現可序列化介面,則該類的父類所有的欄位屬性將不會序列化。

  (2)宣告為static和transient型別的成員資料不能被序列化。因為static代表類的狀態, transient代表物件的臨時資料;

  (3)相關的類和介面:在java.io包中提供的涉及物件的序列化的類與介面有ObjectOutput介面、ObjectOutputStream類、ObjectInput介面、ObjectInputStream類。

    (1)ObjectOutput介面:它繼承DataOutput介面並且支援物件的序列化,其內的writeObject()方法實現儲存一個物件。ObjectInput介面:它繼承DataInput介面並且支援物件的序列化,其內的readObject()方法實現讀取一個物件。

    (2)ObjectOutputStream類:它繼承OutputStream類並且實現ObjectOutput介面。利用該類來實現將物件儲存(呼叫ObjectOutput介面中的writeObject()方法)。ObjectInputStream類:它繼承InputStream類並且實現ObjectInput介面。利用該類來實現讀取一個物件(呼叫ObjectInput介面中的readObject()方法)。

  對於父類的處理,如果父類沒有實現序列化介面,則其必須有預設的建構函式(即沒有引數的建構函式)。否則編譯的時候就會報錯。在反序列化的時候,預設建構函式會被呼叫。但是若把父類標記為可以序列化,則在反序列化的時候,其預設建構函式不會被呼叫。這是為什麼呢?這是因為Java 對序列化的物件進行反序列化的時候,直接從流裡獲取其物件資料來生成一個物件例項,而不是通過其建構函式來完成。

import java.io.*;

public class Cat implements Serializable {

        private String name;

        public Cat () {

                this.name = "new cat";

        }

        public String getName() {

                return this.name;

        }

        public void setName(String name) {

                this.name = name;

        }

        public static void main(String[] args) {         

                Cat cat = new Cat();

                try {

                        FileOutputStream fos = new FileOutputStream("catDemo.out");

                        ObjectOutputStream oos = new ObjectOutputStream(fos);

                        System.out.println(" 1> " + cat.getName());

                        cat.setName("My Cat");                       

                        oos.writeObject(cat);

                        oos.close();                       

                } catch (Exception ex) {  ex.printStackTrace();   }

                try {

                        FileInputStream fis = new FileInputStream("catDemo.out");

                        ObjectInputStream ois = new ObjectInputStream(fis);

                        cat = (Cat) ois.readObject();

                        System.out.println(" 2> " + cat.getName());

                        ois.close();

                } catch (Exception ex) {

                        ex.printStackTrace();

                }

        }

}//writeObject和readObject本身就是執行緒安全的,傳輸過程中是不允許被併發訪問的。所以物件能一個一個接連不斷的傳過來