利用序列化和反序列化来实现对象的深拷贝

对象的深拷贝一般有三种:

1、在构造方法阶段深拷贝:对每个属性创建相同的字面量

2、实现Cloneable接口,告诉JVM这是一个可以拷贝的类,并重写Object.clone()方法,实现对引用对象深度遍历拷贝

3、就是通过序列化和反序列化的方式

import java.io.Serializable;


public class Address implements Serializable {
    String address;

    public Address(String address) {
        this.address = address;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}
import java.io.*;

public class User implements Serializable {
    String name;
    Address address;

    public User(String name, Address address) {
        this.name = name;
        this.address = address;
    }

    public String getName() {
        return name;
    }

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

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    // 实际的数据流向:ObjectOutputStream->ByteArrayOutputStream->ByteArrayInputStream ->ObjectInputStream,深度复制从序列化对象又转为序列化对象
    public User copy() throws IOException, ClassNotFoundException {
        // 序列化
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
        objectOutputStream.writeObject(this);   // 将this对象 转变为 二进制字节流

        // 反序列化
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
        ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
        return (User) objectInputStream.readObject();
    }
}
import java.io.IOException;

public class TestDeepCopy {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        User u1 = new User("Liu Haoran", new Address("Henan Province"));
        User u2 = u1.copy();
        System.out.println(u1 == u2);   // u1和u2在Java堆中的地址不同
        // 但是二者的属性的字面量是相同的
        System.out.println("u1:" + u1.getName() + " " + u1.getAddress().getAddress());
        System.out.println("u2:" + u2.getName() + " " + u2.getAddress().getAddress());
    }
}

 

posted @ 2022-03-17 11:19  Peterxiazhen  阅读(253)  评论(0编辑  收藏  举报