克隆和序列化

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”变量,值保持不变,便可以进行序列化和反序列化


你可能感兴趣的:(java,开发语言,后端)