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='女'}]

上面我們可以看出,這種方式是可以實現深度複製的,我們使用序列化的方式,將我們的數據寫進字節流裏,然後我們把字節流再讀出來,實現這種深度複製,從本質上來說我們要複製的是它的物理內存裏的信息,不是它的引用,這種方式可以實現。

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