軟件測試開發技術java對象序列化[2]

發表于:2009-11-18來源:作者:點擊數: 標簽:軟件測試javaJAVAJava序列
軟件測試開發技術 java 對象序列化[2] 軟件測試開發技術 關鍵字:oo // 序列化 today's date 到一個文件中. FileOutputStream f = new FileOutputStream("tmp"); ObjectOutputStream s = new ObjectOutputStream(f); s.writeObject("Today"); s.writeObject(

軟件測試開發技術java對象序列化[2]  軟件測試開發技術

關鍵字:oo   // 序列化 today's date 到一個文件中.
    FileOutputStream f = new FileOutputStream("tmp");
    ObjectOutputStream s = new ObjectOutputStream(f);
    s.writeObject("Today");
    s.writeObject(new Date());
    s.flush();

    現在,讓我們來了解ObjectInputStream這個類。它與ObjectOutputStream相似。它擴展DataInput接口。ObjectInputStream中的方法鏡像DataInputStream中讀取Java基本數據類型的公開方法。readObject()方法從字節流中反序列化對象。每次調用readObject()方法都返回流中下一個Object。對象字節流并不傳輸類的字節碼,而是包括類名及其簽名。readObject()收到對象時,JVM裝入頭中指定的類。如果找不到這個類,則readObject()拋出ClassNotFoundException,如果需要傳輸對象數據和字節碼,則可以用RMI框架。ObjectInputStream的其余方法用于定制反序列化過程。

    例子如下:

    //從文件中反序列化 string 對象和 date 對象
    FileInputStream in = new FileInputStream("tmp");
    ObjectInputStream s = new ObjectInputStream(in);
    String today = (String)s.readObject();
    Date date = (Date)s.readObject();

    定制序列化過程:

    序列化通??梢宰詣油瓿?,但有時可能要對這個過程進行控制。java可以將類聲明為serializable,但仍可手工控制聲明為static或transient的數據成員。

    例子:一個非常簡單的序列化類。

    public class simpleSerializableClass implements Serializable{
    String sToday="Today:";
    transient Date dtToday=new Date();
    }

    序列化時,類的所有數據成員應可序列化除了聲明為transient或static的成員。將變量聲明為transient告訴JVM我們會負責將變元序列化。將數據成員聲明為transient后,序列化過程就無法將其加進對象字節流中,沒有從transient數據成員發送的數據。后面數據反序列化時,要重建數據成員(因為它是類定義的一部分),但不包含任何數據,因為這個數據成員不向流中寫入任何數據。記住,對象流不序列化static或transient。我們的類要用writeObject()與readObject()方法以處理這些數據成員。使用writeObject()與readObject()方法時,還要注意按寫入的順序讀取這些數據成員。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97