Java通过序列化实现深复制

本文介绍了一种通过序列化实现对象深复制的方法,详细展示了如何将对象转换为二进制数组,再从二进制数组中恢复出原始对象的副本。此方法适用于实现了Serializable接口的类。
    /**
     * 序列化实现深复制<br>
     * 被序列化的对象及其引用对象都必须实现{@link Serializable}接口
     *
     * @param clz 被反序列化的类型
     * @param t   被序列化的对象
     * @param <T> 实现{@link Serializable}接口的类
     * @return 复制后的对象
     */
    public static <T extends Serializable> T deepClone(Class<T> clz, T t) {
    
        return bytesToObject(clz,  objectToBytes(t));
    }


    /**
     * 对象序列化为二进制数组
     *
     * @param t   被序列化的对象
     * @param <T> 实现{@link Serializable}接口的类
     * @return 对象的二进制数组
     */
    public static <T extends Serializable> byte[] objectToBytes(T t) {

        byte[] bytes = null;

        try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
             ObjectOutputStream oos = new ObjectOutputStream(baos)) {

            oos.writeObject(t);
            bytes = baos.toByteArray();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return bytes;
    }

    /**
     * 二进制数组反序列化为对象
     *
     * @param clz   被反序列化的类型
     * @param bytes 二进制数组
     * @param <T>   实现{@link Serializable}接口的类
     * @return 被反序列化或得到的对象
     */
    public static <T extends Serializable> T bytesToObject(Class<T> clz,
                                                           byte[] bytes) {

        Object obj = null;

        try (ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
             ObjectInputStream ois = new ObjectInputStream(bais)) {

            obj = ois.readObject();

        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return clz.cast(obj);
    }

测试
getter/setter/构造器就不写了

public class Person implements Serializable {

    private String name;
    private int age;
    private String sex;
    private Address address;
public class Address implements Serializable {
	//邮编
    private int postcode;
    public static void main(String[] args) {

        Person person = new Person("xyz", 11, "男", new Address(100000));

        long start = System.nanoTime();
        //进行复制
        Person clone = deepClone(Person.class, person);
        long end = System.nanoTime();
        System.out.println((end - start) / 1000000.0 + "毫秒");

        System.out.println(person.getAddress().equals(clone.getAddress()));
        System.out.println(person.getAddress().getPostcode());
        System.out.println(clone.getAddress().getPostcode());
    }

结果:

51.800092毫秒
false
100000
100000
Java中,可以使用序列化实现深拷贝。深拷贝是指创建一个全新的对象,将原始对象的所有属性值复制到新对象中。以下是一个简单的示例代码,演示如何通过序列化实现深拷贝: ```java import java.io.*; class MyClass implements Serializable { private int value; public MyClass(int value) { this.value = value; } public int getValue() { return value; } } public class DeepCopyExample { public static void main(String[] args) throws IOException, ClassNotFoundException { // 创建原始对象 MyClass originalObj = new MyClass(10); // 将原始对象序列化到字节数组输出流中 ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(originalObj); oos.close(); // 从字节数组输入流中反序列化出新的对象 ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); MyClass clonedObj = (MyClass) ois.readObject(); ois.close(); // 修改原始对象的值 originalObj.setValue(20); // 输出结果 System.out.println("Original value: " + originalObj.getValue()); System.out.println("Cloned value: " + clonedObj.getValue()); } } ``` 在上面的示例中,我们定义了一个名为`MyClass`的类,它实现了`Serializable`接口。然后,我们创建了一个原始对象`originalObj`,并将其序列化到字节数组输出流中。接着,我们通过反序列化从字节数组输入流中创建了一个新的对象`clonedObj`。最后,我们修改了原始对象的值,并输出了原始对象和克隆对象的值。 通过这种方式,我们实现了深拷贝,因为`clonedObj`是一个全新的对象,它的属性值与原始对象`originalObj`的属性值相同,但是它们之间没有引用关系。这意味着对其中一个对象的修改不会影响另一个对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值