1. 程式人生 > >什麼是 Java 序列化,如何實現 java 序列化

什麼是 Java 序列化,如何實現 java 序列化

大概解釋:

序列化就是: 一種用來處理物件流的機制,所謂物件流也就是將物件的內容進行流化。可以對流化後的物件進行讀寫操作,也可將流化後的物件傳輸於網路之間。

序列化是為了: 解決在對物件流進行讀寫操作時所引發的問題。

序列化的實現: 將需要被序列化的類實現Serializable介面,該介面沒有需要實現的方法,implements Serializable只是為了標註該物件是可被序列化的,然後使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(物件流)物件,接著,使用ObjectOutputStream物件的writeObject(Object obj)方法就可以將引數為obj的物件寫出(即儲存其狀態),要恢復的話則用輸入流。

詳細解釋:

當兩個程序在進行遠端通訊時,彼此可以傳送各種型別的資料。無論是何種型別的資料,都會以 二進位制序列 的形式在網路上傳送。傳送方需要把這個 Java 物件轉換為位元組序列,才能在網路上傳送;接收方則需要把位元組序列再恢復為 Java 物件。

只能將支援 java.io.Serializable 介面的物件寫入流中。每個 serializable 物件的類都被編碼,編碼內容包括類名和類簽名、物件的欄位值和陣列值,以及從初始物件中引用的其他所有 物件的閉包

1.概念

序列化:把Java物件轉換為位元組序列的過程。
  反序列化:把位元組序列恢復為Java物件的過程。

2.用途

物件的序列化主要有兩種用途:
  1) 把物件的位元組序列永久地儲存到硬碟上,通常存放在一個檔案中;
  2) 在網路上傳送物件的位元組序列。

3.物件序列化

序列化API

java.io.ObjectOutputStream代表物件輸出流,它的writeObject(Object obj)方法可對引數指定的obj物件進行序列化,把得到的位元組序列寫到一個目標輸出流中。只有實現了Serializable和Externalizable介面的類的物件才能被序列化。

java.io.ObjectInputStream代表物件輸入流,它的readObject()方法從一個源輸入流中讀取位元組序列,再把它們反序列化為一個物件,並將其返回。

程式碼示例:

import java.io.*;
import java.util.Date;

public class ObjectSaver {
    public static void main(String[] args) throws Exception {
        /*其中的  D:\\objectFile.obj 表示存放序列化物件的檔案*/

        
        //序列化物件
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:\\objectFile.obj"));
        Customer customer = new Customer("王麻子", 24);    
        out.writeObject("你好!");    //寫入字面值常量
        out.writeObject(new Date());    //寫入匿名Date物件
        out.writeObject(customer);    //寫入customer物件
        out.close();

        
        //反序列化物件
        ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\\objectFile.obj"));
        System.out.println("obj1 " + (String) in.readObject());    //讀取字面值常量
        System.out.println("obj2 " + (Date) in.readObject());    //讀取匿名Date物件
        Customer obj3 = (Customer) in.readObject();    //讀取customer物件
        System.out.println("obj3 " + obj3);
        in.close();
    }
}

class Customer implements Serializable {
    private String name;
    private int age;
    public Customer(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String toString() {
        return "name=" + name + ", age=" + age;
    }
}

執行結果

在這裡插入圖片描述

4.說明

讀取物件的順序與寫入時的順序要一致。

物件的預設序列化機制寫入的內容是:物件的類,類簽名,以及非瞬態和非靜態欄位的值。