如何在不使用序列化的情况下制作Java对象的深度副本?

6

在不使用序列化的情况下,是否可以对Java对象进行深拷贝/克隆?如果可以,那么如何实现?


你想要实现什么目标? - Kayaman
1
除了反射(如果有的话),没有办法制作任意对象的深度拷贝。要使用序列化,对象必须是可序列化的。 - Hot Licks
@JBNizet 我知道这不是集合类的责任。但我想问一下是否可能?假设,我正在创建的这个集合将在构造时接受一些可变对象/元素的其他集合,并创建一个包装器,以便您只能访问这些元素以进行只读目的,但您无法更改这些元素。 我在考虑在尝试访问任何元素时返回元素的副本。你觉得呢?我只是好奇。 :) - adn.911
1
你必须对你要复制的对象做出很多假设,才能使“深度复制”的概念有意义,更不用说可行了。换句话说,没有像你想象中那样的通用解决方案。 - Marko Topolnik
这个深层复制库可能能解决问题! :) - adn.911
显示剩余4条评论
1个回答

4
您可以使用Java Deep-Cloning Library来制作对象的深层副本。当您不能(或不想)使您的类可序列化时,这非常有用。使用方法很简单:
Cloner cloner = new Cloner();

MyClass clone = cloner.deepClone(o);
// clone is a deep-clone of o

使用此API后,我的JVM崩溃并出现以下错误:***在“/etc/alternatives/java_sdk_1.8.0_openjdk/bin/java”中的错误:双重释放或损坏(out):0x00007f250c140b10 *** =======回溯:========= /lib64/libc.so.6(+0x81609)[0x7f2563519609] - acg
1
“安全问题”怎么办?也许我不想让我的“类”成为可序列化的,因为存在安全问题?那个库是如何在底层实现克隆的,它是否也在某个时候使用了“Serializable”? - atkuzmanov
阅读Github链接中的代码,它会创建一个相同类的新对象实例(使用org.objenesis.instantiator.ObjectInstantiator;),并递归地复制所有字段,根据集合类型进行一些优化/假设。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接