標籤:under 還原序列化 ora 序列化 put cto 資料 文本 zab
序列化流:把對象按照流一樣的方式存入文字檔或者在網路中傳輸。 對象 -- 流資料(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 @Override39 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 //接收對象是Object18 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 }
java中的序列化流和還原序列化流