首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 序列化實戰:對象持久化與反序列化完整指南

     編輯:Java 綜合教學

對象序列化:將 Java 對象轉為位元組流進行存儲或傳輸

Java 序列化機制允許將實現 `Serializable` 介面的對象寫入檔案或網路流,後續可還原為記憶體對象。這是 RMI、分散式會話、緩存同步等場景的基石。

寫入對象(序列化)步驟

  1. 建立 `ObjectOutputStream`,包裝 `FileOutputStream` 指向目標檔案。
  2. 呼叫 `writeObject(obj)` 寫入對象圖(含引用鏈)。
  3. 呼叫 `close()` 刷新緩衝區並釋放資源。

讀取對象(反序列化)步驟

  1. 建立 `ObjectInputStream`,包裝 `FileInputStream` 讀取來源檔案。
  2. 呼叫 `readObject()` 還原對象,需強制轉型為目標類型。
  3. 關閉流釋放資源。

關鍵注意點

  • 必須實現 `Serializable` 介面(標記介面,無方法),否則拋出 `NotSerializableException`。
  • 序列版本號 `serialVersionUID`:建議顯式聲明,避免類修改後反序列化失敗拋出 `InvalidClassException`。
  • transient 關鍵字:標記不需序列化的欄位(如密碼、暫存計算結果)。
  • 靜態欄位不參與序列化,屬於類而非實例。

完整代碼示例

import java.io.*;

public class ObjectStreamDemo {
    public static void main(String[] args) throws Exception {
        writeObj();
        readObj();
    }

    public static void writeObj() throws IOException {
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.object"))) {
            oos.writeObject(new Person("taoshihan", 100));
        }
    }

    public static void readObj() throws IOException, ClassNotFoundException {
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.object"))) {
            Person person = (Person) ois.readObject();
            System.out.println(person); // 輸出 taoshihan:100
        }
    }
}

class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return name + ":" + age;
    }
}

跨語言對比:PHP 序列化

PHP 內建 `serialize()` / `unserialize()`,輸出為字串格式,便於資料庫存儲或跨進程傳遞:

<?php
class Person {
    private $name; private $age;
    public function __construct($name, $age) { $this->name=$name; $this->age=$age; }
    public function toString() { return $this->name.":".$this->age; }
}
$personObj = serialize(new Person("taoshihan", 100));
echo $personObj; // O:6:"Person":2:{s:12:"Personname";s:9:"taoshihan";s:11:"Personage";i:100;}
$obj = unserialize($personObj);
echo $obj->toString(); // taoshihan:100
?>

最佳實踐建議

  1. 優先考慮 JSON/Protobuf/Avro 等跨語言格式,降低耦合與版本演進風險。
  2. 若必須用 Java 原生序列化,嚴格控制 `serialVersionUID`,謹慎修改類結構。
  3. 敏感數據務必標記 `transient` 或實現 `Externalizable` 自定義加密邏輯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved