序列化
我先來講一下概念:
Java 提供了一種對象序列化的機制。用一個字節序列可以表示一個對象,該字節序列包含該對象的數據、對象的類型和對象中存儲的屬性等信息。字節序列寫出文件之後,相當於文件中持久保存 了一個對象的信息。
反之,該字節還可以從文件中讀取回來,重構對象,對它進行反序列化。對象的數據、對象的類型和對象中存儲的屬性等信息,都可以用來在內存中創建對象。
通過下面的圖來理解序列化:
序列化和反序列化時候,會拋出NotSerializableException沒有序列化異常
java.io.Serializable接口可以啓動序列化功能。
Serializable接口一叫標記型接口。
要進行序列化與反序列化時,給類添加這個標記
有:就可以序列化與反序列化
沒有:拋出異常
static關鍵字:靜態關鍵字
靜態優先於非靜態加載到內存中
被static修飾的成員變量不能被序列化,序列化的都是對象
private static int age;
oos.writeObject(new Person("小龍女",18));
Object o = ois.readObject();
Person{name = "小龍女",age=0}
transient關鍵字:瞬態關鍵字
被transient修飾的成員變量不能被序列化
private transient int age;
oos.writeObject(new Person("小龍女",18));
Object o = ois.readObject();
Person{name = "小龍女",age=18}
以ArrayList爲例學習序列化和反序列化
package Demo07;
//序列化集合
/*
1.定義一個存儲Person對象的ArrayList集合
2.往Array List集合中存儲Person對象
3.創建一個序列化流ObjectOutputStream對象
4.使用ObjectOutputStream對象中的方法writeObject,對集合進行序列化
5.創建一個反序列化ObjectInputStream
6.使用ObjectInputStream對象中的方法readObject讀取文件中保存的集合
7.把Object類型的集合轉化爲ArrayList類型
8.遍歷ArrayList集合
9.釋放資源
*/
import java.io.*;
import java.util.ArrayList;
public class Example02 {
public static void main(String[] args) throws IOException,ClassNotFoundException {
ArrayList<Person> list = new ArrayList<>();
list.add(new Person("張三",18));
list.add(new Person("李四",12));
list.add(new Person("王五",28));
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("02.txt"));
oos.writeObject(list);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("02.txt"));
Object o = ois.readObject();
ArrayList<Person> list2 = (ArrayList<Person>) o;
for (Person p:list2
) {
System.out.println(p);
}
ois.close();
oos.close();
}
}
package Demo07;
import java.io.Serializable;
public class Person implements Serializable {
private String name;
private int age;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + 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;
}
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}