1)概念: 序列化:把java對象轉換爲字節序列的過程。 反序列化:把字節序列恢復爲Java對象的過程。java
2)做用: 數據的持久化。 進行遠程通訊(即:在網絡上傳送對象的字節序列) 3)實現:要序列化的類必須實現Serializable接口: 1)若類實現了Serializable接口: 使用ObjectOutputStream的writeObject(Object obj)方法來實現序列化,使用ObjectInputStream的readObject()方法來實現反序列化。 舉例: // 序列化 Person person1 = new Person("jack", 17); Person person2 = new Person("jack", 18); File file = new File("D:\\test\\Person.txt"); FileOutputStream fos = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(person1); // 注:若Person未實現Serializable接口,則writeObject(Object obj)方法會報java.io.NotSerializableException的錯誤。 oos.writeObject(person2); oos.close(); fos.close(); // 反序列化 FileInputStream fis = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(fis); Person person11 = (Person) ois.readObject(); Person person22 = (Person) ois.readObject(); ois.close(); fis.close(); 2)若類實現了Serializable接口,且定義了writeObject方法和readObject方法: 使用類本身定義的writeObject(java.io.ObjectOutputStream s)方法 和 readObject(java.io.ObjectInputStream s)方法 來實現序列化和反序列化。 舉例:ArrayList類 3)若類實現了Externalizable接口: 使用類實現的writeExternal(ObjectOutput out) 和 readExternal(ObjectInput in) 方法來實現序列化和反序列化。 說明:Externalizable接口繼承了Serializable接口,Externalizable接口定義了兩個方法:writeExternal(ObjectOutput out) 和 readExternal(ObjectInput in) 4)注意: 1)反序列化的順序必定要和序列化的順序相同。 2)類中被transient關鍵字修飾的屬性不會被序列化。 說明:若類實現了Externalizable接口,那麼transient修飾的屬性是否能夠序列化取決於該類自定義的writeExternal和readExternal方法的實現。 3)類中的靜態屬性不會被實例化。 4)類中若是未顯式聲明靜態屬性serialVersionUID,那麼在序列化時將基於該類的各個方面計算該類的默認serialVersionUID值。儘管如此,咱們仍是強烈建議全部可序列化的類都顯式聲明serialVersionUID 值,且serialVersionUID建議聲明爲private的。 說明: 1>計算默認的serialVersionUID對類的詳細信息具備較高的敏感性,根據編譯器實現的不一樣可能千差萬別,這樣在反序列化過程當中可能會致使意外的InvalidClassException。 2>數組類不能聲明一個明確的serialVersionUID,所以它們老是具備默認的計算值,可是數組類沒有匹配 serialVersionUID 值的要求。