您的位置:首页 > 移动开发 > Objective-C

使用对象输入输出流(ObjectOutputStream,ObjectInputStream)实现序列化对象的深度克隆

2015-06-21 12:00 603 查看
public static <T> T clone(T obj) throws Exception {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bout);
oos.writeObject(obj);

ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bin);
return (T) ois.readObject();

// 说明:调用ByteArrayInputStream或ByteArrayOutputStream对象的close方法没有任何意义
// 这两个基于内存的流只要垃圾回收器清理对象就能够释放资源
}

测试类:

/**
* 人类
* @author 骆昊
*
*/
class Person implements Serializable {
private static final long serialVersionUID = -9102017020286042305L;

private String name; // 姓名
private int age; // 年龄
private Car car; // 座驾

public Person(String name, int age, Car car) {
this.name = name;
this.age = age;
this.car = car;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public Car getCar() {
return car;
}

public void setCar(Car car) {
this.car = car;
}

@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", car=" + car + "]";
}

}

/**
* 小汽车类
* @author 骆昊
*
*/
class Car implements Serializable {
private static final long serialVersionUID = -5713945027627603702L;

private String brand; // 品牌
private int maxSpeed; // 最高时速

public Car(String brand, int maxSpeed) {
this.brand = brand;
this.maxSpeed = maxSpeed;
}

public String getBrand() {
return brand;
}

public void setBrand(String brand) {
this.brand = brand;
}

public int getMaxSpeed() {
return maxSpeed;
}

public void setMaxSpeed(int maxSpeed) {
this.maxSpeed = maxSpeed;
}

@Override
public String toString() {
return "Car [brand=" + brand + ", maxSpeed=" + maxSpeed + "]";
}

}

class CloneTest {

public static void main(String[] args) {
try {
Person p1 = new Person("Hao LUO", 33, new Car("Benz", 300));
Person p2 = DeepClone.clone(p1); // 深度克隆
p2.getCar().setBrand("BYD");
// 修改克隆的Person对象p2关联的汽车对象的品牌属性
// 原来的Person对象p1关联的汽车不会受到任何影响
// 因为在克隆Person对象时其关联的汽车对象也被克隆了
System.out.println(p1);
System.out.println(p2);

} catch (Exception e) {
e.printStackTrace();
}
}
}输出结果:
Person [name=Hao LUO, age=33, car=Car [brand=Benz, maxSpeed=300]]
Person [name=Hao LUO, age=33, car=Car [brand=BYD, maxSpeed=300]]


可以看到p1对象和p2对象都有car的实例,并且修改了p2以后不会对p1产生影响。

注意点:Person和Car都要实现序列化接口,而泛型的限定可以检查出对象是否支持序列化,这一步在编译阶段完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 泛型 序列化