IO流之序列化和反序列化的詳解

序列化 / 反序列化

概述:序列化 (Serialization)是將對象的狀態信息轉換爲可以存儲或傳輸的形式的過程。

  • 在序列化期間,對象將其當前狀態寫入到臨時或持久性存儲區。以後,可以通過從存儲區中讀取或反序列化對象的狀態,重新創建該對象。

序列化:利用ObjectOutputStream,對象的信息,按固定格式轉成一串字節值輸出並持久保存到磁盤化。

  • 反序列化:利用ObjectInputStream,讀取磁盤中序列化數據,重新恢復對象。

在這裏插入圖片描述

特點/應用場景:

  • 需要序列化的文件必須實現Serializable接口以啓用其序列化功能。
  • 不需要序列化的數據可以被修飾爲static的,由於static屬於類,不隨對象被序列化輸出。
  • 不需要序列化的數據也可以被修飾爲transient臨時的,只在程序運行期間,在內存中存在不會被序列化持久保存。
  • 在反序列化時,如果和序列化的版本號不一致時,無法完成反序列化。
  • 每個被序列化的文件都有一個唯一id,如果沒有添加編譯器會根據類的定義信息計算產生一個版本號。
  • 常用於服務器之間的數據傳輸,序列化成文件,反序列化讀取數據。
  • 常用於使用套接字流在主機之間傳遞對象。

ObjectOutputStream

ObjectOutputStream

  • 將 Java 對象的基本數據類型和圖形寫入 OutputStream。可以使用 ObjectInputStream 讀取(重構)對象。通過在流中使用文件可以實現對象的持久存儲。
> -- ObjectOutputStream(OutputStream out) 
          創建寫入指定 OutputStream 的 ObjectOutputStream。
          
> -- void writeObject(Object obj) 
          將指定的對象寫入 ObjectOutputStream。 

ObjectInputStream

ObjectInputStream

  • 對以前使用 ObjectOutputStream 寫入的基本數據和對象進行反序列化。
> -- ObjectInputStream(InputStream in) 
          創建從指定 InputStream 讀取的 ObjectInputStream。

> -- Object readObject() 
      從 ObjectInputStream 讀取對象,讀取序列化數據。

將學生信息序列化至磁盤【序列化】

public class Seri {
       public static void main(String[] args) throws Exception, IOException {
              //序列化:就是把java對象保存在磁盤中
              ObjectOutputStream os = 
                                          new ObjectOutputStream(
                                                        new FileOutputStream(                                                                      "D:\\teach\\a\\student.txt"));              
              Student s = new Student("張三",20,"成都");
              os.writeObject(s);              
              os.close();//關閉輸出資源              
              //反序列化:從磁盤讀到程序裏
              ObjectInputStream in = 
                            new ObjectInputStream(
                                          new FileInputStream(
                                                        "D:\\teach\\a\\student.txt"));              
              //讀到的對象,默認是Object,需要強轉成子類
              Student s2 = (Student)in.readObject();
              System.out.println(s2);              
       }
}

//1,如果想完成序列化,類必須實現Serializable接口
//只是用來做標記,需要序列化
class  Student implements Serializable{
       //創建對象用
       public Student(String name, int age, String addr) {
              this.name = name;
              this.age = age;
              this.addr = addr;
       }
       //一般序列化的都是屬性
       String name = "張三";
       int age = 20;
       String addr = "成都";       
       //爲了看屬性值
       @Override
       public String toString() {
              return "Student [name=" + name + ", age=" + age + ", addr=" + addr + "]";
     }       
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章