序列化:指將對象的狀態數據以字節流的形式進行處理,在文件中長期存儲。
反序列:從字面上就能知道,指的就是在須要的時候從文件中獲取該對象的信息以從新得到一個徹底的對象。java
(1)永久性保存對象,把對象經過序列化字節流保存到本地文件中。
(2)經過序列化在網絡中傳遞對象
(3)經過序列化在進程間傳遞對象數組
(1)Serializable接口
(2)Externalizable接口:該接口繼承了Serializable接口,是對Serializable的擴展,並提供了readExternal(ObjectInput in)和writeExternal(ObjectOutout out)兩種方法,經過重寫這兩個方法來實現自身的序列化行爲的控制。在對實現了Externalizable的類的對象進行反序列化時,會先調用該類的無參構造函數,若無參構造函數被刪除或被設置爲private、default或protected時會拋出Java.io.InvalidException:no valid construction等網絡
1)序列化實現步驟:
(1)須要序列化的對象所屬類必須實現Serializable接口;
(2)構造FileOutputStream對象;
(3)構造ObjectOutputStream對象;
(4)使用ObjectOutputStream對象的writeObject()方法進行序列化;
(5)關閉ObjectOutputStream對象;
(6)關閉FileOutputStream對象;
(7)對序列化全程捕獲IOException;ide
2)反序列化實現步驟:
(1)須要序列化的對象所屬類必須實現Serializable接口;
(2)構造FileInputStream對象;
(3)構造ObjectInputStream對象;
(4)使用ObjectInputStream對象的readObject()方法進行反序列化;
(5)關閉ObjectInputStream對象;
(6)關閉FileInputStream對象;
(7)對序列化全程捕獲ClassNotFoundException和IOException;函數
3)注意:
1. 只有實現了Serializable或Externalizable的類的對象才能夠實現序列化。
2. 對象和對象數組均可以實現序列化
3. 若一個父類實現了Serializable或Externalizable接口,其子類均實現了Serializable或Externalizable接口。
4. 實現Serializable或Externalizable接口的類應提供無參構造函數
5. static的屬性和方法不能被序列化,由於static的屬性和方法與對象無關,而序列化和反序列化則是針對對象而言的。
6. 對於不但願被序列化的非static成員和方法能夠使用transient關鍵字標明.(關於transient關鍵字的用法參考博文Java的transient關鍵字)
7.若一個序列化子類的父類是非序列化的,則該子類從父類繼承下來的變量將恢復其默認初始值而不被初始化。this
package effectivejava; import java.io.*; import java.util.Date; /** * Created by louyuting on 16/11/11. * 序列化與反序列化 */ class Customer implements Serializable{ private String name; private String age; public Customer() { } public Customer(String age, String name) { this.age = age; this.name = name; } @Override public String toString() { return "name=" + this.name + ", age="+this.age; } } public class SerializableTest { public static void main(String[] args) throws IOException, ClassNotFoundException { //獲取序列化對象 ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("/opt/objectFile.obj")); Customer customer = new Customer("婁宇庭", "24"); out.writeObject("你好!"); out.writeObject(new Date()); out.writeObject(customer); out.close(); //反序列化對象 ObjectInputStream in = new ObjectInputStream(new FileInputStream("/opt/objectFile.obj")); System.out.println("obj1:"+ (String)in.readObject()); System.out.println("obj2:"+ (Date)in.readObject()); System.out.println("obj3:"+ (Customer)in.readObject()); in.close(); } }