实现深度对象复制功能有点困难。您采取了哪些步骤来确保原始对象和克隆对象不共享引用?
bihw5rsg16#
您可以在不创建文件的情况下通过序列化创建深度副本。你想要深度复制的对象需要 implement serializable . 如果类不是final或无法修改,请扩展该类并实现serializable。将类转换为字节流:
implement 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();
4nkexdtk17#
一种安全的方法是序列化对象,然后反序列化。这确保了一切都是一个全新的参考。下面是一篇关于如何有效地做到这一点的文章。注意:类可以重写序列化,这样就不会创建新的示例,例如针对单例。当然,如果类不可序列化,那么这也不起作用。
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)); } }
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();
你是怎么得到克隆人的。
8tntrjer20#
您可以使用 org.apache.commons.lang3.SerializationUtils.clone(T) 在apachecommons-lang中,但是要小心性能太差了。一般来说,最好为对象图中需要克隆的对象的每个类编写自己的克隆方法。
org.apache.commons.lang3.SerializationUtils.clone(T)
20条答案
按热度按时间bihw5rsg16#
您可以在不创建文件的情况下通过序列化创建深度副本。
你想要深度复制的对象需要
implement serializable
. 如果类不是final或无法修改,请扩展该类并实现serializable。将类转换为字节流:
从字节流还原类:
4nkexdtk17#
一种安全的方法是序列化对象,然后反序列化。这确保了一切都是一个全新的参考。
下面是一篇关于如何有效地做到这一点的文章。
注意:类可以重写序列化,这样就不会创建新的示例,例如针对单例。当然,如果类不可序列化,那么这也不起作用。
ffscu2ro18#
mklgxw1f19#
下面是一个关于如何深度克隆任何对象的简单示例:首先实现serializable
然后
你是怎么得到克隆人的。
8tntrjer20#
您可以使用
org.apache.commons.lang3.SerializationUtils.clone(T)
在apachecommons-lang中,但是要小心性能太差了。一般来说,最好为对象图中需要克隆的对象的每个类编写自己的克隆方法。