天天看點

java之對象序列化java之對象序列化

java之對象序列化

1. 定義:

把java對象轉為與平台無關的二進制流,将其進行儲存在磁盤上,或者通過網絡進行傳輸。

2. 序列化的意義:

可以讓對象獨立于程式單獨存在

3. 反序列化:

将二進制檔案轉為對象

4. 序列化條件:

讓某個類能進行序列化必須實作Serializable(不要實作任何方法)或者Externalizable,在進行網絡對象的時候,該對象所對應的類都要實作序列化。

5. 注意事項:

注意序列化隻是把對象的資料存入進去,反序列化也就是拿出來資料,并不是該類,且反序列化的順序和序列化的順序是相同的

6. 對象引用序列化:

例如下面代碼,必須Student類和Teacher類同時實作Serializable接口

public Class Teacher{

private Student stu=new Student();

}

7. 方法:

序列化可以使用ObjectOutputStream的writeObject等方法,反序列化可以使用ObjectInputStream的readObject方法

8. 特殊情況:

public class People{
        private String pname;
        private int age;
        public People(String pname,int age){
            this.pname=pname;
            this.age=age;
        }
    }
    public Class Teacher{
        private People p;
        public Teacher(People p){
            this.p=p;
        }
    }
    public class Test{
        public static void main(String[] args){
            People people=new People("zhangsan",18);
            Teacher t1=new Teacher(people);
            Teacher t2=new Teacher(people);
            ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("d:/test.txt"));

        }
    }
           

8.1 觀看上面代碼,看下這個過程people被序列化了幾次呢?

也許有人會說,上面的的people被序列化了三次,但是不是的,其實每次序列化一個對象,都會給該對象一個編号,當在進行序列化之前,首先檢查是否該對象已經被序列化了,如果有就直接輸出一個序列化編号,否則就進行序列化。

9. 避免序列化:

有時候,為了資訊安全,需要避免序列化,還有序列化存在遞歸的情況,是以很可能導緻異常,例如A對象引用B對象 ,B對象引用C對象,C對象引用D對象,則必須讓A,B,C,D都實作Serializable,否則會抛出異常,如果想讓某個屬性不被序列化,則使用transient,transient隻能用于執行個體化變量,不能修飾java其它的成分。