java序列化实现深度克隆本质是“写成字节流再读回来”,新旧对象完全独立;要求所有嵌套类均实现serializable,transient字段不序列化,static字段共享,不可序列化资源类不适用。

Java 中用序列化实现深度克隆,本质是把对象“写成字节流再读回来”,新对象和原对象在堆内存中完全独立,包括所有 private、嵌套、集合类字段——只要它们都可序列化。
前提条件:所有层级类必须实现 Serializable
不是只有顶层类实现就够了。比如 Person → Address → List
注意两点:
- transient 字段不会被序列化,克隆后为 null 或默认值;如需保留,得自定义 writeObject/readObject 方法
- static 字段不属于对象实例,序列化不处理,克隆前后共享同一份
核心代码:通用工具方法
封装一个静态方法,接受任意可序列化对象,返回其深度克隆副本:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
// 不需要反射读字段,也不关心 private —— 序列化自动搞定
public static
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
oos.close();
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
return (T) ois.readObject();
}
对复杂结构特别有效的点
嵌套对象、List/Map/Set、树形结构、循环引用(JDK 7+ 默认支持)——这些让手动深拷贝极易出错的场景,序列化天然覆盖:
- List
克隆后,里面的每个 User 都是新实例,连带其 address、profile 等字段全递归复制 - 父子双向引用(Parent.children 指向 Child,Child.parent 指回 Parent)不会栈溢出,反序列化自动还原引用关系
- private final String id 字段会被正确保留(final 不影响序列化,只要它本身可序列化)
实际使用注意事项
不是万能,但可控:
- 含 Socket、Thread、File 等不可序列化资源的对象不能用——这是设计意图,不该克隆这类状态
- 性能比手动拷贝略低,但对中等复杂度对象(几十个字段、几层嵌套)基本无感
- 若类里有自定义序列化逻辑(writeObject),要确保它也支持克隆语义,比如不跳过关键字段
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










