1 clone
必须实现Cloneable
----只是一个标识,默认为浅拷贝
(如果内部字段有引用,则会指向同一个引用,),如果需要深拷贝,则内部引用字段也需要实现Cloneable,再在重写clone方法时,对内部字段调用super.clone()。
@Override
protected Object clone() throws CloneNotSupportedException {
AAAA a = (AAAA)super.clone();
BBBB b = (BBBB)super.clone();
a.setB(b);
return a;
}
2 序列化
必须实现Serializable,也是一个标识, 深拷贝
Bom aaa = new Bom();
Bom aaa1 = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(aaa);
ByteArrayInputStream bis = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
aaa1= (Bom)ois.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return aaa1;
3序列化id的作用
其实,这个序列化ID起着关键的作用,它决定着是否能够成功反序列化!简单来说,java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地实体类中的serialVersionUID进行比较,如果相同则认为是一致的,便可以进行反序列化,否则就会报序列化版本不一致的异常。
序列化ID如何产生:
当我们一个实体类中没有显示的定义一个名为“serialVersionUID”、类型为long的变量时,Java序列化机制会根据编译时的class自动生成一个serialVersionUID作为序列化版本比较,这种情况下,只有同一次编译生成的class才会生成相同的serialVersionUID。譬如,当我们编写一个类时,随着时间的推移,我们因为需求改动,需要在本地类中添加其他的字段,这个时候再反序列化时便会出现serialVersionUID不一致,导致反序列化失败。那么如何解决呢?便是在本地类中添加一个“serialVersionUID”变量,值保持不变,便可以进行序列化和反序列化