(21)IO流之對象的序列化和反序列化流ObjectOutputStream和ObjectInputStream


當創建對象時,程序運行時它就會存在,但是程序停止時,對象也就消失了.但是如果希望對象在程序不運行的情況下仍能存在並保存其信息,將會非常有用,對象將被重建並且擁有與程序上次運行時擁有的信息相同。可以使用對象的序列化。

 對象的序列化:   將內存中的對象直接寫入到文件設備中

 對象的反序列化: 將文件設備中持久化的數據轉換為內存對象

基本的序列化由兩個方法產生:一個方法用於序列化對象並將它們寫入一個流,另一個方法用於讀取流並反序列化對象。

 

ObjectOutput

 

writeObject(Object obj)

 

          將對象寫入底層存儲或流。

 

ObjectInput

 

readObject()

 

          讀取並返回對象。

 

 

下面介紹的就是他們的實現子類:ObjectOutputStreamObjectInputStream

 

對象的輸入輸出流:對象的輸入輸出流的主要作用是:用於對象信息的讀寫,對象信息一旦寫到文件上那么對象的信息就可以持久化

 

 

對象的輸出流

 

ObjectOutputStream 主要用用於輸出對象

 

ObjectOutputStream的使用步驟

 

1、找到目標文件

 

2、建立數據的輸出流通道,需要准備一個FileOutputStream流

 

3、建立對象的輸出流通道

 

4、把對象寫出去

 

5、關閉資源

 

使用反序列化,就是使用流ObjectInputStream流,完全和上面相反的步驟。

 

對象輸入輸出流使用需要注意的細節:

 

1、如果對象需要被寫出到文件上,那么對象所屬的類必須要實現Serializable接口,Serializable接口沒有任何的方法,是一個標志接口。

 

2、對象的反序列化和對象的克隆,創建對象的時候,並不會調用構造方法。

 

3serialVersionUID是用於記錄class文件的版本信息的,serialVersionUID這個數字是通過一個類的類名,成員,包名,工程名算出來的一個數字。

 

4、使用ObjectInputStream反序列化的時候,ObjectInputStream會先讀取文件中的serialVersionUID與本地的serialVersionUID對比,如果不一致反序列化失敗

 

5、如果反序列化的時候可能會修改類的成員,那么最好一開始就給這個類,指定一個serialVersionUID,如果一個類已經指定了serialVersionUID,然后在序列化和反序列化的時候,jvm都不會自己計算這個classserialVersionUID了。這樣就不怕無法序列化和反序列化了。點擊累前面的黃色箭頭,添加一個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 }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM