序列化就是將一個對象的狀態(各個屬性量)保存起來,而後在適當的時候再得到。序列化分爲兩大部分:序列化和反序列化。java
對於父類的處理,若是父類沒有實現序列化接口,則其必須有默認的構造函數(即沒有參數的構造函數)。不然編譯的時候就會報錯。在反序列化的時候,默認構造函數會被調用。可是若把父類標記爲能夠序列化,則在反序列化的時候,其默認構造函數不會被調用。這是爲何呢?這是由於Java 對序列化的對象進行反序列化的時候,直接從流裏獲取其對象數據來生成一個對象實例,而不是經過其構造函數來完成。安全
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; /** * Author: Leo Sun * Blog: http://kaffa.im/ * Date: Aug 12, 2014 */ public class SerializableDemo { public static void main(String[] args) { Cat cat = new Cat(); try { FileOutputStream fos = new FileOutputStream("catDemo.out"); ObjectOutputStream oos = new ObjectOutputStream(fos); System.out.println(" 1> " + cat.getName()); cat.setName("My Cat"); oos.writeObject(cat); oos.close(); } catch (Exception ex) { ex.printStackTrace(); } try { FileInputStream fis = new FileInputStream("catDemo.out"); ObjectInputStream ois = new ObjectInputStream(fis); cat = (Cat) ois.readObject(); System.out.println(" 2> " + cat.getName()); ois.close(); } catch (Exception ex) { ex.printStackTrace(); } } } class Cat implements Serializable { private static final long serialVersionUID = -5426949996723910122L; private String name; public Cat() { this.name = "new cat"; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } }
注:writeObject和readObject自己就是線程安全的,傳輸過程當中是不容許被併發訪問的。因此對象能一個一個接連不斷的傳過來網絡