Java 序列化实现List的深度复制

在开发过程中我们经常需要深度复制list,在不借助其他架包的情况下,方法靠谱的不多,这里提供方法,使用序列化的方式完成深度复制的工具;

首先创建一个POJO类:

package com.main.dto;

import java.io.Serializable;

public class User implements Serializable {
    private Long id;
    private String name;
    private Long age;
    private String sex;

    public User() {}

    public User(Long id, String name, Long age, String sex) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    //setter 和 getter 省略
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }
}

这里要注意一点,要继承接口Serializable才能实现序列化

工具方法:

/**
 * 深度复制的方法
 */
public static <T> List<T> listCopy(List<T> src) {
    List<T> dest = null;
    try {
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
        ObjectOutputStream out = new ObjectOutputStream(byteOut);
        out.writeObject(src);

        ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
        ObjectInputStream in = new ObjectInputStream(byteIn);
        dest = (List<T>) in.readObject();
    } catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
    }

    return dest;
}

测试方法:

@Test
public void test1() {
    User user1 = new User(1L, "xm", 12L, "男");
    User user2 = new User(2L, "xh", 13L, "女");

    List<User> userList = new ArrayList<>();
    userList.add(user1);
    userList.add(user2);

    List<User> userList1 = userList;
    List<User> userList2 = listCopy(userList);

    userList.get(1).setAge(100L);

    System.out.println("userList1--> " + userList1.toString());
    System.out.println("userList2--> " + userList2.toString());
}

测试结果:

userList1--> [User{id=1, name='xm', age=12, sex='男'}, User{id=2, name='xh', age=100, sex='女'}]
userList2--> [User{id=1, name='xm', age=12, sex='男'}, User{id=2, name='xh', age=13, sex='女'}]

上面我们可以看出,这种方式是可以实现深度复制的,我们使用序列化的方式,将我们的数据写进字节流里,然后我们把字节流再读出来,实现这种深度复制,从本质上来说我们要复制的是它的物理内存里的信息,不是它的引用,这种方式可以实现。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章