什麼是java序列化,如何實現java序列化?

Java 串行化技術可以使你將一個對象的狀態寫入一個Byte 裏,並且可以從其它地方把該Byte 流裏的數據讀出來,重新構造一個相同的對象。這種機制允許你將對象通過網絡進行傳播,並可以隨時把對象持久化到數據庫、文件等系統裏Java的串行化機制是RMIEJB等技術的技術基礎。用途:利用對象的串行化實現保存應用程序的當前工作狀態,下次再啓動的時候將自動地恢復到上次執行的狀態。

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

序列化的實現:將需要被序列化的類實現Serializable接口,然後使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(對象流)對象,接着,使用ObjectOutputStream對象的writeObject(Object obj)方法就可以將參數爲obj的對象寫出(即保存其狀態),要恢復的話則用輸入流。

2、串行化的特點:

    1)如果某個類能夠被串行化,其子類也可以被串行化。如果該類有父類,則分兩種情況來考慮,如果該父類已經實現了可串行化接口。則其父類的相應字段及屬性的處理和該類相同;如果該類的父類沒有實現可串行化接口,則該類的父類所有的字段屬性將不會串行化。

  2)聲明爲statictransient類型的成員數據不能被串行化。因爲static代表類的狀態, transient代表對象的臨時數據;

  3)相關的類和接口:在java.io包中提供的涉及對象的串行化的類與接口有ObjectOutput接口、ObjectOutputStream類、ObjectInput接口、ObjectInputStream類。

    1ObjectOutput接口:它繼承DataOutput接口並且支持對象的串行化,其內的writeObject()方法實現存儲一個對象。ObjectInput接口:它繼承DataInput接口並且支持對象的串行化,其內的readObject()方法實現讀取一個對象。

    2ObjectOutputStream類:它繼承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();

                }

        }

}//writeObjectreadObject本身就是線程安全的,傳輸過程中是不允許被併發訪問的。所以對象能一個一個接連不斷的傳過來


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章