好记性不如烂笔头,复习一下深克隆
实际使用时由于序列化的方式实现深度克隆性能较差,还是推荐使用Cloneable接口的方式重写clone方法,但是注意该方法需要注意克隆对象的对象(多层)
话不多说,下面讲一下深度克隆,深克隆实现相对简单一点,只需要被克隆的对象实现Serializable接口,克隆的过程相对比较通用
被克隆对象:
import java.io.Serializable;
public class SerialCar implements Serializable {
private static final long serialVersionUID = -7308342867043888945L;
private String carType;
private String carName;
public SerialCar() {
}
public SerialCar(String carType, String carName) {
this.carType = carType;
this.carName = carName;
}
public String getCarType() {
return carType;
}
public void setCarType(String carType) {
this.carType = carType;
}
public String getCarName() {
return carName;
}
public void setCarName(String carName) {
this.carName = carName;
}
@Override
public String toString() {
return "SerialCar{" +
"carType='" + carType + '\'' +
", carName='" + carName + '\'' +
'}';
}
}
import java.io.Serializable;
public class SerialUser implements Serializable {
private static final long serialVersionUID = -2167957013938386204L;
private String username;
private SerialCar serialCar;
public SerialUser() {
}
public SerialUser(String username, SerialCar serialCar) {
this.username = username;
this.serialCar = serialCar;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public SerialCar getSerialCar() {
return serialCar;
}
public void setSerialCar(SerialCar serialCar) {
this.serialCar = serialCar;
}
@Override
public String toString() {
return "SerialUser{" +
"username='" + username + '\'' +
", serialCar=" + serialCar +
'}';
}
}
测试代码:
import java.io.*;
public class TestDeepClone {
public static void main(String[] args) throws IOException, ClassNotFoundException {
SerialUser serialUser = new SerialUser("李四", new SerialCar("奔驰", "250"));
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(serialUser);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
SerialUser cloneUser = (SerialUser)ois.readObject();
SerialCar cloneCar = cloneUser.getSerialCar();
cloneCar.setCarType("奥迪");
cloneCar.setCarName("A8");
System.out.println(serialUser);
System.out.println(cloneUser);
}
}
测试结果: