浅深克隆和序列化总结
http://coach.iteye.com/blog/854072http://www.cnblogs.com/rollenholt/archive/2011/09/09/2172094.html
/*
* 为克隆使用序列化,
* 直接将对象序列化到输出流中,然后将其读回,这样产生的新对象是对现有对象的一个深拷贝
* 在此过程中,不必将对象写出到文件,可以用ByteArrayOutPutStream将数据保存到字节数组中
*
* 这个方法很灵巧,它通常会比显示地构建新对象并复制或克隆数据域的克隆方法慢得多
*/
public class SerialCloneTest
{
public static void main(String[] args)
{
Employee harry = new Employee("Harry Hacker", 35000);
// clone harry
Employee harry2 = (Employee) harry.clone();
System.out.println(harry==harry2);
System.out.println(harry);
System.out.println(harry2);
}
}
/**
A class whose clone method uses serialization.
*/
class SerialCloneable implements Cloneable, Serializable
{
private static final long serialVersionUID = 1L;
//深拷贝
public Object clone()
{
try
{
// save the object to a byte array
//将该对象序列化成流,因为写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面
ByteArrayOutputStream bout = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bout);
out.writeObject(this);
out.close();
// read a clone of the object from the byte array
ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
ObjectInputStream in = new ObjectInputStream(bin);
Object ret = in.readObject();
in.close();
return ret;
}
catch (Exception e)
{
return null;
}
}
}
/**
The familiar Employee class, redefined to extend the
SerialCloneable class.
*/
class Employee extends SerialCloneable
{
private static final long serialVersionUID = 1L;
private String name;
private double salary;
public Employee(String n, double s)
{
name = n;
salary = s;
}
public String getName()
{
return name;
}
public double getSalary()
{
return salary;
}
public String toString()
{
return getClass().getName()
+ "[name=" + name
+ ",salary=" + salary
+ "]";
}
}