當創建對象時,程序運行時它就會存在,但是程序停止時,對象也就消失了.但是如果希望對象在程序不運行的情況下仍能存在並保存其信息,將會非常有用,對象將被重建並且擁有與程序上次運行時擁有的信息相同。可以使用對象的序列化。
對象的序列化: 將內存中的對象直接寫入到文件設備中
對象的反序列化: 將文件設備中持久化的數據轉換為內存對象
基本的序列化由兩個方法產生:一個方法用於序列化對象並將它們寫入一個流,另一個方法用於讀取流並反序列化對象。
ObjectOutput
writeObject(Object obj)
將對象寫入底層存儲或流。
ObjectInput
readObject()
讀取並返回對象。
下面介紹的就是他們的實現子類:ObjectOutputStream和ObjectInputStream
對象的輸入輸出流:對象的輸入輸出流的主要作用是:用於對象信息的讀寫,對象信息一旦寫到文件上那么對象的信息就可以持久化
對象的輸出流
ObjectOutputStream 主要用用於輸出對象
ObjectOutputStream的使用步驟
1、找到目標文件
2、建立數據的輸出流通道,需要准備一個FileOutputStream流
3、建立對象的輸出流通道
4、把對象寫出去
5、關閉資源
使用反序列化,就是使用流ObjectInputStream流,完全和上面相反的步驟。
對象輸入輸出流使用需要注意的細節:
1、如果對象需要被寫出到文件上,那么對象所屬的類必須要實現Serializable接口,Serializable接口沒有任何的方法,是一個標志接口。
2、對象的反序列化和對象的克隆,創建對象的時候,並不會調用構造方法。
3、serialVersionUID是用於記錄class文件的版本信息的,serialVersionUID這個數字是通過一個類的類名,成員,包名,工程名算出來的一個數字。
4、使用ObjectInputStream反序列化的時候,ObjectInputStream會先讀取文件中的serialVersionUID與本地的serialVersionUID對比,如果不一致反序列化失敗
5、如果反序列化的時候可能會修改類的成員,那么最好一開始就給這個類,指定一個serialVersionUID,如果一個類已經指定了serialVersionUID,然后在序列化和反序列化的時候,jvm都不會自己計算這個class的serialVersionUID了。這樣就不怕無法序列化和反序列化了。點擊累前面的黃色箭頭,添加一個serialVersionUID
6、如果一個對象的某個數據不想序列化到硬盤上,可以使用關鍵字transient修飾
7、如果一個類,維護了另外一個類的引用,另外一個類,也需要實現Serializable接口。如果無法修改這個類的源碼,可以給這個類創建一個可序列化的子類。如果這個類是final的也就是不可以繼承的。那么就在使用trancint關鍵字,或者是指定serialVersionUID。
下面是一個簡單的例子:

1 class Address implements Serializable 2 { 3 String country; 4 String city; 5 6 public Address(String country, String city) 7 { 8 this.country = country; 9 this.city = city; 10 } 11 } 12 13 14 class User implements Serializable{ 15 16 private static final long serialVersionUID = -1241976087141510667L; 17 18 String userName ; 19 20 String password ; 21 22 transient int age; 23 24 Address address; 25 26 public User(String name, String pass) 27 { 28 this.userName = name; 29 this.password = pass; 30 } 31 32 public User(String name, String pass, int age, Address address) 33 { 34 this.userName = name; 35 this.password = pass; 36 this.age = age; 37 this.address = address; 38 } 39 40 @Override 41 public String toString() 42 { 43 return "用戶名:"+this.userName+" 密碼:"+this.password+" 年齡:"+this.age+" 地址:"+this.address.city; 44 } 45 } 46 47 48 public class Demo3 49 { 50 public static void main(String[] args) throws IOException, ClassNotFoundException 51 { 52 //把user的信息持久化 53 /*User user = new User("admin", "123"); 54 System.out.println(user); 55 */ 56 writeObj(); 57 readObj(); 58 59 } 60 61 //把文件中的對象信息取出來 62 public static void readObj() throws IOException, ClassNotFoundException 63 { 64 File file = new File("D:\\users.txt"); 65 FileInputStream fileInputStream = new FileInputStream(file); 66 //建立對象的輸入流對象 67 ObjectInputStream inputStream = new ObjectInputStream(fileInputStream); 68 //讀取獨對象信息 69 User user = (User) inputStream.readObject(); //創建對象坑定要依賴對象所屬的class文件 70 System.out.println(user); 71 } 72 73 74 //定義方法把對象的信息寫到硬盤上------>對象的序列化 75 public static void writeObj() throws IOException 76 { 77 Address address = new Address("China", "Anhui"); 78 User user = new User("admin", "123", 15, address); 79 80 //1、找到目標文件 81 File file= new File("D:\\users.txt"); 82 //建立數據的輸出流對象 83 FileOutputStream fileOutputStream = new FileOutputStream(file); 84 //建立對象的輸出流對象 85 ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); 86 //把對象寫出去 87 objectOutputStream.writeObject(user);//序列化house的內容 是給JVM看的 一般我們是看不懂的 88 //關閉資源 89 objectOutputStream.close(); 90 } 91 92 }