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其它的成分。