我们可以利用clone方法来实现对象只见的复制,但对于比较复杂的对象(比如对象中包含其他对象,其他对象又包含别的对象.....)这样我们必须进行层层深度clone,每个对象需要实现 cloneable接口,比较麻烦,那就继续学习下一个序列化方法。
创建
/*
* 文 件 名: A.java 版 权: Unis Cloud Information Technology Co., Ltd. Copyright
* 2015, All rights reserved 描 述: 修 改 人: Administrator 修改时间: 2015-11-10
* 跟踪单号: 修改单号: 修改内容:
*/
package com.hubin.supers;
import java.io.Serializable;
/**
*
*
* @author Administrator
* @version [版本号, 2015-11-10]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public class A implements Serializable {
private String name;
private int age;
/**
* @return 返回 name
*/
public String getName() {
return name;
}
/**
* @param 对name进行赋值
*/
public void setName(String name) {
this.name = name;
}
/**
* @return 返回 age
*/
public int getAge() {
return age;
}
/**
* @param 对age进行赋值
*/
public void setAge(int age) {
this.age = age;
}
/**
* @return
*/
@Override
public String toString() {
return "A [name=" + name + ", age=" + age + "]";
}
}
创建B类:
/*
* 文 件 名: B.java 版 权: Unis Cloud Information Technology Co., Ltd. Copyright
* 2015, All rights reserved 描 述: 修 改 人: Administrator 修改时间: 2015-11-10
* 跟踪单号: 修改单号: 修改内容:
*/
package com.hubin.supers;
import java.io.Serializable;
/**
*
*
* @author Administrator
* @version [版本号, 2015-11-10]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public class B implements Serializable {
private A a;
private String name;
/**
* @return 返回 a
*/
public A getA() {
return a;
}
/**
* @param 对a进行赋值
*/
public void setA(A a) {
this.a = a;
}
/**
* @return 返回 name
*/
public String getName() {
return name;
}
/**
* @param 对name进行赋值
*/
public void setName(String name) {
this.name = name;
}
/**
* @return
*/
@Override
public String toString() {
return "B [a=" + a + ", name=" + name + "]";
}
}
创建测试Desc类:
/*
* 文 件 名: Desc.java 版 权: Unis Cloud Information Technology Co., Ltd. Copyright
* 2015, All rights reserved 描 述: 修 改 人: Administrator 修改时间: 2015-11-10
* 跟踪单号: 修改单号: 修改内容:
*/
package com.hubin.supers;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author Administrator
* @version [版本号, 2015-11-10]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public class Desc {
public static void main(String[] args) throws Exception {
A a = new A();
a.setName("张三");
a.setAge(10);
B b = new B();
b.setA(a);
b.setName("南京");
List list = new ArrayList();
list.add(b);
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteOut);
out.writeObject(list);
ByteArrayInputStream byteIn = new ByteArrayInputStream(
byteOut.toByteArray());
ObjectInputStream in = new ObjectInputStream(byteIn);
List list1 = (List) in.readObject();
list1.get(0).getA().setName("李四");
System.out.println(list.get(0));
System.out.println(list1.get(0));
}
}
结果:
B [a=A [name=张三, age=10], name=南京]
B [a=A [name=李四, age=10], name=南京]
从结果可以看到当修改序列化后的对象的值不会影响原先对象的值,所以可以通过序列化进行深度克隆