如何制作对象的深度副本?

ev7lccsx  于 2021-06-30  发布在  Java
关注(0)|答案(20)|浏览(413)

实现深度对象复制功能有点困难。您采取了哪些步骤来确保原始对象和克隆对象不共享引用?

bihw5rsg

bihw5rsg16#

您可以在不创建文件的情况下通过序列化创建深度副本。
你想要深度复制的对象需要 implement serializable . 如果类不是final或无法修改,请扩展该类并实现serializable。
将类转换为字节流:

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(object);
oos.flush();
oos.close();
bos.close();
byte[] byteData = bos.toByteArray();

从字节流还原类:

ByteArrayInputStream bais = new ByteArrayInputStream(byteData);
(Object) object = (Object) new ObjectInputStream(bais).readObject();
4nkexdtk

4nkexdtk17#

一种安全的方法是序列化对象,然后反序列化。这确保了一切都是一个全新的参考。
下面是一篇关于如何有效地做到这一点的文章。
注意:类可以重写序列化,这样就不会创建新的示例,例如针对单例。当然,如果类不可序列化,那么这也不起作用。

ffscu2ro

ffscu2ro18#

import com.thoughtworks.xstream.XStream;

public class deepCopy {
    private static  XStream xstream = new XStream();

    //serialize with Xstream them deserialize ...
    public static Object deepCopy(Object obj){
        return xstream.fromXML(xstream.toXML(obj));
    }
}
mklgxw1f

mklgxw1f19#

下面是一个关于如何深度克隆任何对象的简单示例:首先实现serializable

public class CSVTable implements Serializable{
    Table<Integer, Integer, String> table; 
    public CSVTable() {
        this.table = HashBasedTable.create();
    }

    public CSVTable deepClone() {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(this);

            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bais);
            return (CSVTable) ois.readObject();
        } catch (IOException e) {
            return null;
        } catch (ClassNotFoundException e) {
            return null;
        }
    }

}

然后

CSVTable table = new CSVTable();
CSVTable tempTable = table.deepClone();

你是怎么得到克隆人的。

8tntrjer

8tntrjer20#

您可以使用 org.apache.commons.lang3.SerializationUtils.clone(T) 在apachecommons-lang中,但是要小心性能太差了。
一般来说,最好为对象图中需要克隆的对象的每个类编写自己的克隆方法。

相关问题