1.序列化与反序列化
import cn.hutool.core.util.ClassUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import java.io.*;
public class DeepCopyExample {
public static <T> T deepCopy(T object) {
try {
// 创建一个字节输出流
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
// 创建一个对象输出流包装字节输出流
ObjectOutputStream out = new ObjectOutputStream(byteOut);
// 将对象写入到输出流中
out.writeObject(object);
// 关闭对象输出流,释放资源
out.close();
// 创建一个字节输入流包装字节输出流中的数据
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
// 创建一个对象输入流包装字节输入流
ObjectInputStream in = new ObjectInputStream(byteIn);
// 从输入流中读取对象并返回
@SuppressWarnings("unchecked")
T copyObject = (T) in.readObject();
// 关闭对象输入流,释放资源
in.close();
return copyObject;
} catch (IOException | ClassNotFoundException e) {
throw new IORuntimeException(e);
}
}
public static void main(String[] args) {
MyObject original = new MyObject(1, "Test");
MyObject copy = deepCopy(original);
System.out.println("Original: " + original); // Original: MyObject{id=1, name='Test'}
System.out.println("Copy: " + copy); // Copy: MyObject{id=1, name='Test'} (注意:这里的输出可能看起来相同,但实际上是不同的对象)
}
}
2.Hutool 工具类
Hutool 提供了简单易用的工具类,可以进行深拷贝和浅拷贝:
深拷贝
Person deepCopy = CloneUtil.clone(original);
这里也补充一下Hutool的浅拷贝
Person copy = ShallowUtil.clone(original);
3.Apache SerializationUtils
apache SerializationUtils使用的也是Java原生的序列化和反序列化,来实现对象的深拷贝,因此类也需要实现Serializable接口。
pom文件中引入如下依赖:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.10</version>
</dependency>
使用如下:
User newUser = SerializationUtils.clone(oldUser);