java中的序列化流和反序列化流


序列化流:把對象按照流一樣的方式存入文本文件或者在網絡中傳輸。    對象 -- 流數據(ObjectOutputStream)

反序列化流:把文本文件中的流對象數據或者網絡中的流對象數據還原成對象。流數據 -- 對象(ObjectInputStream)

序列化流和反序列化流不同於字節流 字符流 內存字節流,這些都是把字符串寫入/讀取文件,序列化流和反序列化流可以將對象寫入/讀取文本文件中.

但是我們要注意的是,寫入和讀取的文件要實現Serializable這個接口,當然這個接口是沒有任何方法的,直接implements就好,類似於這種沒有任何方法的接口被稱為標記接口.

可是當我們對原有的對象中的數據改變了之后,直接讀取(不寫入,在實際開發中不能每改一次就寫入一次),就會報錯:

 

 

java.io.InvalidClassException: DemoPerson; local class incompatible: stream classdesc serialVersionUID = -2071565876962058344,  local class serialVersionUID = -8345153069362641443

這是因為對象類實現Serializable就會有一個id值,當改變對象中的數據時,這個id值會發生改變,但是文本文件中的寫入和讀取的id還是以前的id值,造成id值不匹配,就會報錯,解決辦法:對象類中會報一個黃色的警告,點擊這個警告按照編譯器實現就行.

附代碼:

Person

 1 public class Person implements Serializable {
 2     private static final long serialVersionUID = -2071565876962058344L;
 3 
 4     private String name;
 5 
 6     // private int age;
 7 
 8     private transient int age;
 9 
10     // int age;
11 
12     public Person() {
13         super();
14     }
15 
16     public Person(String name, int age) {
17         super();
18         this.name = name;
19         this.age = age;
20     }
21 
22     public String getName() {
23         return name;
24     }
25 
26     public void setName(String name) {
27         this.name = name;
28     }
29 
30     public int getAge() {
31         return age;
32     }
33 
34     public void setAge(int age) {
35         this.age = age;
36     }
37 
38     @Override
39     public String toString() {
40         return "Person [name=" + name + ", age=" + age + "]";
41     }
42 }

ObjectStreamDemo

 1 import java.io.FileInputStream;
 2 import java.io.FileOutputStream;
 3 import java.io.IOException;
 4 import java.io.ObjectInputStream;
 5 import java.io.ObjectOutputStream;
 6 
 7 public class ObjectStreamDemo {
 8     public static void main(String[] args) throws IOException, ClassNotFoundException {
 9 //        write();
10         
11         read();
12     }
13 
14     private static void read() throws IOException, ClassNotFoundException {
15         //反序列化對象
16         ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oss.txt"));
17         //接收對象是Object
18         Object ob = ois.readObject();
19         
20         ois.close();
21         
22         System.out.println(ob);
23     }
24 
25     private static void write() throws IOException {
26         //創建序列化輸出流
27         ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oss.txt"));
28         
29         Person p = new Person("熊大", 16);
30         
31         oos.writeObject(p);
32         
33         oos.close();
34     }
35 }

 

 

 


免責聲明!

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



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