序列化流:把對象按照流一樣的方式存入文本文件或者在網絡中傳輸。 對象 -- 流數據(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 }