java對象流與序列化


Object流,直接把obj寫入或讀出.

前言:

比如 畫圖的程序,咣當畫一個三角形出來,咣當畫一正方形出來。然后存盤,當你下次再打開軟件的時候三角形、方塊還在原來的位置上。如果用面向對象的思維,三角形,方塊都有自己的成員變量,x、y坐標、顏色、線的顏色、粗細等,你存盤的時候要把這些內容寫到硬盤上,寫到文件里,這叫存盤。比如說一個方塊,你存盤的時候只要把起始點的坐標,寬度,高度顏色等等存進去,當再顯示的時候再在原處把它畫出來。

序列化:把一個object直接轉換成字節流寫到硬盤上或者寫到網絡上。

實際在內存中會new出方塊的一個對象來,有它各種的屬性,存盤的時候要挨着把這些屬性都給存到文件里,用DataOutputStream就可以實現,不管它的屬性是int,dubbo等。既然把這個object的內容都要寫到硬盤上,何不把整個object全部寫進去呢,因為把object  new出來的時候無非也就是內存里的一塊區域,也就是一個字節一個字節的,干脆把整個字節,這一小塊內存全都寫進硬盤,更合適,更方便,這就是object的初衷。當然New出來的對象除了自己的屬性外,還有標識object的版本號,this、super指針,相關的內容都會寫進去。這就是object流的作用。這就是序列化。

java.io.Serializable:

可序列化的。如果想吧一個類的對象寫到硬盤上或者網絡上,想把它序列化成一個字節流,必須實現序列化接口。

可序列化類的所有子類型本身都是可序列化的。

沒有方法,標記性的接口,給編譯器看的,編譯器看到這個接口后就知道這個類能被序列化。

例子程序:

package lhy.io;


import java.io.*;

public class TestObjectIO {
    public static void main(String args[]) throws Exception {
        T t = new T();
        t.k = 8;
        //寫對象,.dat保存數據的文件
        //文件輸出流
        FileOutputStream fos = new FileOutputStream("d:/share/testobjectio.dat");
        //套一層對象輸出流
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        //寫對象
        oos.writeObject(t);
        oos.flush();
        oos.close();
        
        //讀取
        FileInputStream fis = new FileInputStream("d:/share/testobjectio.dat");
        ObjectInputStream ois = new ObjectInputStream(fis);
        //讀一個Object
        T tReaded = (T)ois.readObject();
        //10  9  2.3  0   小洋仔,transient標識的成員變量k,不能被序列化,是int默認值0
        System.out.println(tReaded.i + " " + tReaded.j + " " 
                    + tReaded.d + " " + tReaded.k+" "+tReaded.str);
        
    }
}
/**
 * 實現序列化接口
 */
class T implements Serializable
{
    int i = 10;
    int j = 9;
    double d = 2.3;
    //transient:透明的,序列化的時候不予考慮
    transient int k = 15;
    String str = "小洋仔";
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM