什麼是Java Serializable(序列化)
1、序列化是幹什麼的?
簡單說就是為了儲存在記憶體中的各種物件的狀態(也就是例項變數,不是方法),並且可以把儲存的物件狀態再讀出來。雖然你可以用你自己的各種各樣的方法來保 存object states,但是Java給你提供一種應該比你自己好的儲存物件狀態的機制,那就是序列化。
2、什麼情況下需要序列化
a)當你想把的記憶體中的物件狀態儲存到一個檔案中或者資料庫中時候;
b)當你想用套接字在網路上傳送物件的時候;
c)當你想通過RMI傳輸物件的時候;
3、當對一個物件實現序列化時,究竟發生了什麼?
在沒有序列化前,每個儲存在堆(Heap)中的物件都有相應的狀態(state),即例項變數(instance ariable)比如:
當 通過下面的程式碼序列化之後,MyFoo物件中的width和Height例項變數的值(37,70)都被儲存到foo.ser檔案中,這樣以後又可以把它 從檔案中讀出來,重新在堆中建立原來的物件。當然儲存時候不僅僅是儲存物件的例項變數的值,JVM還要儲存一些小量資訊,比如類的型別等以便恢復原來的對 象。
4、實現序列化(儲存到一個檔案)的步驟
a)Make a FileOutputStream
c)write the object
d) close the ObjectOutputStream
5、舉例說明
6、相關注意事項
a)序列化時,只對物件的狀態進行儲存,而不管物件的方法;
b)當一個父類實現序列化,子類自動實現序列化,不需要顯式實現Serializable介面;
c)當一個物件的例項變數引用其他物件,序列化該物件時也把引用物件進行序列化;
d)並非所有的物件都可以序列化,,至於為什麼不可以,有很多原因了,比如:
1.安全方面的原因,比如一個物件擁有private,public等field,對於一個要傳輸的物件,比如寫到檔案,或者進行rmi傳輸 等等,在序列化進行傳輸的過程中,這個物件的private等域是不受保護的。
2. 資源分配方面的原因,比如socket,thread類,如果可以序列化,進行傳輸或者儲存,也無法對他們進行重新的資源分 配,而且,也是沒有必要這樣實現
簡單說就是為了儲存在記憶體中的各種物件的狀態(也就是例項變數,不是方法),並且可以把儲存的物件狀態再讀出來。雖然你可以用你自己的各種各樣的方法來保 存object states,但是Java給你提供一種應該比你自己好的儲存物件狀態的機制,那就是序列化。
2、什麼情況下需要序列化
a)當你想把的記憶體中的物件狀態儲存到一個檔案中或者資料庫中時候;
b)當你想用套接字在網路上傳送物件的時候;
c)當你想通過RMI傳輸物件的時候;
3、當對一個物件實現序列化時,究竟發生了什麼?
在沒有序列化前,每個儲存在堆(Heap)中的物件都有相應的狀態(state),即例項變數(instance ariable)比如:
java 程式碼
- Foo myFoo = new Foo();
- myFoo .setWidth(37);
- myFoo.setHeight(70);
當 通過下面的程式碼序列化之後,MyFoo物件中的width和Height例項變數的值(37,70)都被儲存到foo.ser檔案中,這樣以後又可以把它 從檔案中讀出來,重新在堆中建立原來的物件。當然儲存時候不僅僅是儲存物件的例項變數的值,JVM還要儲存一些小量資訊,比如類的型別等以便恢復原來的對 象。
java 程式碼
- FileOutputStream fs = new FileOutputStream("foo.ser");
- ObjectOutputStream os = new ObjectOutputStream(fs);
- os.writeObject(myFoo);
4、實現序列化(儲存到一個檔案)的步驟
a)Make a FileOutputStream
java 程式碼
FileOutputStream fs = new FileOutputStream("foo.ser");
b)Make a ObjectOutputStream java 程式碼
- ObjectOutputStream os = new ObjectOutputStream(fs);
java 程式碼
- os.writeObject(myObject1);
- os.writeObject(myObject2);
- os.writeObject(myObject3);
java 程式碼
- os.close();
5、舉例說明
java 程式碼
- import java.io.*;
- public class Box implements Serializable
- {
- private int width;
- private int height;
- public void setWidth(int width){
- this.width = width;
- }
- public void setHeight(int height){
- this.height = height;
- }
- public static void main(String[] args){
- Box myBox = new Box();
- myBox.setWidth(50);
- myBox.setHeight(30);
- try{
- FileOutputStream fs = new FileOutputStream("foo.ser");
- ObjectOutputStream os = new ObjectOutputStream(fs);
- os.writeObject(myBox);
- os.close();
- }catch(Exception ex){
- ex.printStackTrace();
- }
- }
- }
6、相關注意事項
a)序列化時,只對物件的狀態進行儲存,而不管物件的方法;
b)當一個父類實現序列化,子類自動實現序列化,不需要顯式實現Serializable介面;
c)當一個物件的例項變數引用其他物件,序列化該物件時也把引用物件進行序列化;
d)並非所有的物件都可以序列化,,至於為什麼不可以,有很多原因了,比如:
1.安全方面的原因,比如一個物件擁有private,public等field,對於一個要傳輸的物件,比如寫到檔案,或者進行rmi傳輸 等等,在序列化進行傳輸的過程中,這個物件的private等域是不受保護的。
2. 資源分配方面的原因,比如socket,thread類,如果可以序列化,進行傳輸或者儲存,也無法對他們進行重新的資源分 配,而且,也是沒有必要這樣實現
相關文章
- Serializable java序列化Java
- java的序列化SerializableJava
- Java序列化是什麼Java
- Java中什麼是序列化?Java
- 什麼是java序列化?什麼情況下需要序列化?Java
- 什麼是Java序列化,如何實現java序列化Java
- Java序列化(Serializable)與反序列化詳解Java
- 什麼是Java序列化?如何實現序列化?Java
- Serializable詳解(1):程式碼驗證Java序列化與反序列化Java
- Java是什麼_Java是做什麼的?Java
- 為什麼Java需要物件的序列化Java物件
- Java是什麼? Java適用於什麼工作?Java
- 什麼是java常量?Java
- 什麼是java常量Java
- java 中/**是什麼Java
- 什麼是JAVA ? (轉)Java
- Java是什麼 (轉)Java
- 序列化和反序列化的底層實現原理是什麼?
- 什麼是序列化?物件和類的區別?物件
- Java是什麼?主要是幹什麼的?Java
- Java swing是什麼?有什麼作用?Java
- java中RMI是什麼Java
- java中@Inherited是什麼?Java
- java中@Retention是什麼?Java
- Java 繼承是什麼?Java繼承
- Java專案是什麼?Java
- 序列化Serializable和Parcelable的理解和區別
- Java三大框架是什麼,有什麼作用Java框架
- 什麼是java?為什麼大家都學習java技術?Java
- Java到底是什麼?學習java可以做什麼呢?Java
- java.io.Serializable淺析Java
- 什麼是 Java 構造器?Java
- java | 什麼是動態代理?Java
- java中lock介面是什麼Java
- java中死鎖是什麼Java
- java switch語句是什麼?Java
- java稀疏陣列是什麼Java陣列
- Java到底是什麼呢Java