序列化

序列化

我先來講一下概念:
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;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章