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

Java 物件序列化為 XML 工具類:基於 XMLEncoder/XMLDecoder 實現

     編輯:Java 相關知識

為什麼選擇 XML 序列化?

JDK 內建 java.beans.XMLEncoder / XMLDecoder 提供人類可讀、跨版本相容、無需第三方依賴的物件持久化方案,適合配置檔、狀態快照、簡單數據交換場景。

工具類完整實現

package com.imct.util;

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 使用 XML 文件存取可序列化物件的工具類
 * @author 殷晉
 * @version 1.0
 */
public class ObjectToXMLUtil {

    /**
     * 將可序列化物件編碼為 XML 文件
     * @param obj  目標物件(需實現 Serializable)
     * @param fileName 完整路徑文件名
     * @throws FileNotFoundException 文件路徑無效
     * @throws IOException I/O 錯誤
     */
    public static void objectXMLEncoder(Object obj, String fileName)
            throws FileNotFoundException, IOException {
        File file = new File(fileName);
        // 自動建立父目錄
        File parentDir = file.getParentFile();
        if (parentDir != null && !parentDir.exists()) {
            parentDir.mkdirs();
        }

        try (FileOutputStream fos = new FileOutputStream(file);
             XMLEncoder encoder = new XMLEncoder(fos)) {
            encoder.writeObject(obj);
            encoder.flush();
        }
    }

    /**
     * 從 XML 文件解碼物件列表(支援多物件順序寫入)
     * @param fileName 完整路徑文件名
     * @return 物件列表(按寫入順序)
     * @throws FileNotFoundException 文件不存在
     * @throws IOException I/O 錯誤
     */
    @SuppressWarnings("unchecked")
    public static List<Object> objectXMLDecoder(String fileName)
            throws FileNotFoundException, IOException {
        List<Object> objList = new ArrayList<>();
        File file = new File(fileName);
        try (FileInputStream fis = new FileInputStream(file);
             XMLDecoder decoder = new XMLDecoder(fis)) {
            Object obj;
            while ((obj = decoder.readObject()) != null) {
                objList.add(obj);
            }
        }
        return objList;
    }
}

關鍵設計點

  • 資源管理:使用 try-with-resources 確保流關閉,避免洩漏。
  • 目錄自建:mkdirs() 避免因目錄不存在拋出異常。
  • 多物件支援:解碼端循環讀取直到 null,兼容單物件與多物件場景。
  • 異常透傳:保留原始異常堆疊,便於上層精準處理。

使用示例

// 寫入
User user = new User("張三", 25);
List<User> users = Arrays.asList(user, new User("李四", 30));
ObjectToXMLUtil.objectXMLEncoder(users, "data/users.xml");

// 讀取
List<Object> list = ObjectToXMLUtil.objectXMLDecoder("data/users.xml");
for (Object o : list) {
    System.out.println(o); // 需目標類重寫 toString()
}

適用性與限制

優點缺點
零依賴、JDK 內建、XML 可讀、版本容錯性強 效能、體積遜於二進制/JSON;不支援循環引用;需 JavaBean 慣例(無參建構子 + getter/setter)

建議場景:配置持久化、會話狀態存檔、小型數據交換、測試數據準備。高性能/大數據場景請使用 Protobuf、Kryo、Jackson JSON。

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