對象中的數據,以流的形式,寫入到文件中保存 過程稱為寫出對象,對象的序列化 ObjectOutputStream將對象寫到文件中,實現序列化 在文件中,以流的形式,將對象讀取出來, 讀取對象,對象的反序列化 ObjectInputStream將文件對象讀取出來,實現反序列化 示例: 簡單寫一個類: ...
對象中的數據,以流的形式,寫入到文件中保存
過程稱為寫出對象,對象的序列化
ObjectOutputStream將對象寫到文件中,實現序列化
在文件中,以流的形式,將對象讀取出來,
讀取對象,對象的反序列化
ObjectInputStream將文件對象讀取出來,實現反序列化
示例:
簡單寫一個類:
package demo; import java.io.Serializable; public class Person implements Serializable { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } public Person(String name, int age) { super(); this.name = name; this.age = age; } public Person() { } }
測試:
package demo; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class ObjectStreamDemo { public static void main(String[] args) throws IOException, ClassNotFoundException { function1();// 寫入 function2();// 讀取 } public static void function1() throws IOException { FileOutputStream fos1 = new FileOutputStream("d:\\person.txt"); ObjectOutputStream oos1 = new ObjectOutputStream(fos1); Person p1 = new Person("zhangsan", 18); oos1.writeObject(p1); oos1.close(); } public static void function2() throws IOException, ClassNotFoundException { FileInputStream fis1 = new FileInputStream("d:\\person.txt"); ObjectInputStream ois1 = new ObjectInputStream(fis1); Object object = ois1.readObject(); System.out.println(object); ois1.close(); } }
註意事項:
1.靜態不能序列化,如果將Person類的age加上static,然後序列化操作,發現無論怎樣,總有age=0
原因:對象序列化,而靜態不屬於對象,屬於類,對象不包含靜態,所以靜態不能序列化,age=0的原因是預設為0
transient關鍵字:阻止成員變數序列化
有時候不希望成員變數序列化,但又不能將它定義為靜態,這時候加上transient關鍵字即可
再解釋下上邊的person類是serializable介面的實現類:
這個介面中沒有方法,稱為標記性介面,起到標記作用,如果person類被標記才可以被序列化
序列號衝突問題:
原理通俗解釋:
定義了一個person類,定義了兩個私有成員變數,編譯生成新文件person.class文件
編譯器根據類的定義,會給class文件計算出一個序列號,這時候將class文件寫入某個文件
讀取的時候會對比序列號,序列號相同則反序列成功
如果突然修改person類的源碼,這時候新編譯後的class文件和之前的序列號不同,
然而文件中保存的是之前的序列號,這時候對比序列號,不一致,所以會拋出異常
解決序列號衝突問題的辦法:
在自定義類中自定義序列號:
加入這一行,前部分不可改,後邊的數字可以隨意改
//固定寫法 private static final long serialVersionUID = 42L;