Java通过序列化实现深复制

    /**
     * 序列化实现深复制<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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值