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

Java 序列化進階:你可能不知道的 5 件事(一)——從 Hashtable 遷移到 HashMap 的序列化替換術

     編輯:Java 相關知識

真實案例:序列化儲存的陷阱

某專案將使用者設定存於 Hashtable 並序列化持久化。後來團隊決定遷移至 HashMap,卻發現兩者序列化格式不相容,數百萬用戶設定面臨無法讀取的危機。若不知序列化允許類別替換,勢必被迫繼續使用 Hashtable 或編寫龐大轉換工具。

Java 序列化核心機制

Java 序列化(JDK 1.1 引入)將物件狀態「凍結」為位元組陣列,便於儲存或網路傳輸,稍後可「解凍」還原為可用物件。核心類別:

  • ObjectOutputStream:寫入物件
  • ObjectInputStream:讀取物件
  • Serializable 標記介面:類別實作即參與序列化協定

範例:Person 類別序列化與反序列化

package com.tedneward;

public class Person implements java.io.Serializable {
    public Person(String fn, String ln, int a) {
        this.firstName = fn; this.lastName = ln; this.age = a;
    }
    // getter/setter/toString...
    private String firstName, lastName;
    private int age;
    private Person spouse;
}

JUnit 4 測試:序列化到磁碟並讀回驗證

public class SerTest {
    @Test public void serializeToDisk() {
        try {
            Person ted = new Person("Ted", "Neward", 39);
            Person charl = new Person("Charlotte", "Neward", 38);
            ted.setSpouse(charl); charl.setSpouse(ted);

            FileOutputStream fos = new FileOutputStream("tempdata.ser");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(ted);
            oos.close();
        } catch (Exception ex) { fail("Write failed: " + ex); }

        try {
            FileInputStream fis = new FileInputStream("tempdata.ser");
            ObjectInputStream ois = new ObjectInputStream(fis);
            Person ted = (Person) ois.readObject();
            ois.close();
            assertEquals(ted.getFirstName(), "Ted");
            assertEquals(ted.getSpouse().getFirstName(), "Charlotte");
            new File("tempdata.ser").delete();
        } catch (Exception ex) { fail("Read failed: " + ex); }
    }
}

本系列將揭露 5 個關於 Java 序列化的實用冷知識,幫助你解決遷移、安全、效能等實務挑戰。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved