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

Java 深拷貝實現:序列化與 JSON 兩種通用方案封裝

     編輯:Java 相關知識

深拷貝核心思路

深拷貝需遞歸複製對象圖中所有引用對象。本文提供工具類 DeepCopy,自動嘗試兩種方案:

  1. Java 序列化:要求對象圖中所有類實作 Serializable。
  2. JSON 序列化:依賴 net.sf.json.JSONObject(json-lib),無需實作介面,但需無參構造器與 Setter/Getter。

完整工具類代碼

public class DeepCopy {
    public static  T copy(T obj) throws Exception {
        // 1. 嘗試 Java 序列化
        if (Serializable.class.isAssignableFrom(obj.getClass())) {
            try { return copyImplSerializable(obj); } catch (Exception ignored) {}
        }
        // 2. 回退 JSON 序列化
        if (hasJson()) {
            try { return copyByJson(obj); } catch (Exception ignored) {}
        }
        return null;
    }

    @SuppressWarnings("unchecked")
    private static  T copyImplSerializable(T obj) throws Exception {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(obj);
        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bais);
        T result = (T) ois.readObject();
        oos.close(); ois.close(); baos.close(); bais.close();
        return result;
    }

    private static boolean hasJson() {
        try { Class.forName("net.sf.json.JSONObject"); return true; }
        catch (Exception e) { return false; }
    }

    @SuppressWarnings("unchecked")
    private static  T copyByJson(T obj) throws Exception {
        return (T) JSONObject.toBean(JSONObject.fromObject(obj), obj.getClass());
    }
}

使用示例

User original = new User("Alice", new Address("Beijing"));
User cloned = DeepCopy.copy(original);
cloned.getAddress().setCity("Shanghai");
// original 不受影響

方案對比與選型建議

維度Java 序列化JSON 序列化
前置條件所有類實作 Serializable引入 json-lib,類有無參構造器
性能較快(二進制)較慢(文本解析)
跨語言不支援天然支援
透明度高(無侵入業務代碼)需依賴第三方庫

現代專案建議考慮 Jackson/Gson 替代 json-lib,或使用 MapStruct、Cloneable 手寫拷貝以獲得最佳性能與類型安全。

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