java序列化深拷贝本质是将对象写为字节流再重建,彻底切断引用关系;要求所有相关类实现serializable接口,显式声明serialversionuid,transient或不可序列化字段会重置为默认值,第三方类需换用gson等方案。

Java 中通过序列化实现深拷贝,本质是把原对象“写成字节流”,再从字节流“重建一个全新对象”。这个过程天然切断所有引用关系,新对象及其嵌套的每个子对象(比如 List 里的元素、User 中的 Address)都会分配新的内存地址,真正达到完全独立。
核心前提:所有相关类必须可序列化
目标类本身,以及它内部所有引用类型的字段(包括集合中的泛型类型、嵌套对象等),都必须实现 Serializable 接口。建议显式声明 private static final long serialVersionUID,避免因类结构微调导致反序列化失败。
- 不可序列化的字段(如
transient或未实现Serializable的第三方类)会在反序列化时被设为默认值(null、0、false),可能引发空指针或逻辑错误 - 如果某个引用类型无法修改(如第三方库类),就不能用纯 Java 序列化方式,需换用 Gson/Jackson 等支持忽略或自定义序列化的方案
标准实现步骤(不依赖第三方库)
使用 ObjectOutputStream 和 ObjectInputStream 配合字节数组完成内存内序列化/反序列化:
- 创建
ByteArrayOutputStream,包装成ObjectOutputStream - 调用
writeObject()将原对象写入字节流 - 用
ByteArrayInputStream读取字节数组,再包装成ObjectInputStream - 调用
readObject()得到新对象,强制转为目标泛型类型 - 务必关闭流(或使用 try-with-resources),防止资源泄漏
封装成通用工具方法
推荐将逻辑封装为静态泛型方法,复用性强且类型安全:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
public static
try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos)) {
oos.writeObject(obj);
try (ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis)) {
return (T) ois.readObject();
}
} catch (IOException | ClassNotFoundException e) {
throw new RuntimeException("深拷贝失败", e);
}
}
调用时直接传入对象,返回即为深拷贝结果,例如:User copy = deepCopy(originalUser);
与原型模式结合的常见用法
在原型模式中,不必拘泥于 super.clone()。可在具体原型类的 clone() 方法里直接调用上述 deepCopy() 工具方法:
- 类仍需实现
Cloneable接口(仅作标记,不参与逻辑) -
clone()方法体内不再调用super.clone(),而是返回deepCopy(this) - 这样既满足原型接口语义,又确保每次克隆都是彻底的深拷贝
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










