加速java深度复制操作
我们使用序列化实现了一个通用的深度复制机制加速java深度复制操作,java,performance,serialization,Java,Performance,Serialization,我们使用序列化实现了一个通用的深度复制机制 import java.io.*; public class CopyUtil { public static Object clone(Object source) { Object retVal = null; try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutp
import java.io.*;
public class CopyUtil {
public static Object clone(Object source) {
Object retVal = null;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(source);
oos.flush();
oos.close();
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
retVal = in.readObject();
} catch (IOException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
return retVal;
}
}
有相当多的对象类需要维护,这些对象类一直在进化——这就是我们继续使用通用克隆机制的原因。我们不喜欢在200多个类上维护readObject()
和writeObject()
不幸的是,Java中的序列化机制相对较慢,当系统处于峰值负载时,我们会遇到问题
关于如何加快速度,或者(如果我们做得不正确)克隆对象的替代方法,有什么建议吗?您可能想查看一下。我不知道它是如何实现的,但您可能会发现它是一个更快的解决方案
虽然它没有解决速度问题,但有一些相关的资源值得研究。中实现了一种比序列化快得多的替代方法(特别是在二级缓存中);我不知道细节,但你可以查看源代码 您可能知道,
clone()
接口已损坏,因此最好避免使用,除非有真正令人信服的理由使用它。从,第11项:明智地覆盖克隆
考虑到与Cloneable
相关的所有问题,可以肯定地说
其他接口不应该扩展它,而这些类是为继承而设计的
(第17项)不应执行。由于它的许多缺点,有些
专家程序员只需选择从不覆盖clone
方法,并且从不覆盖
调用它,可能除了复制数组。如果为继承设计类,
请注意,如果您选择不提供行为良好的受保护的克隆
方法,子类将不可能实现Cloneable
更新:关于浅层/深层克隆
发件人:
创建并返回此对象的副本。“复制”的确切含义可能取决于对象的类别。[……]
按照约定,此方法返回的对象应该独立于此对象(正在克隆)。要实现这种独立性,可能需要在返回super.clone返回的对象之前修改该对象的一个或多个字段。通常,这意味着复制构成被克隆对象内部“深层结构”的任何可变对象,并将对这些对象的引用替换为对副本的引用。如果类仅包含基本字段或对不可变对象的引用,则通常情况下super.clone返回的对象中不需要修改任何字段
所以事实上,公约就是要做一个深度复制
不过,首选的替代方法是定义一个复制构造函数或一个独立的方法,而不是重写
clone()
它是通过反射clone()
执行浅层克隆来实现的。@Bozho,默认实现,是。@Bozho:Object.clone()
执行浅层克隆,但是任何实现Cloneable
的类都应该重写该方法以执行深度克隆。在这种情况下,您不需要调用它clone()
。它可能是copy()
或deepClone()
@Bozho,不幸的是,情况比这更复杂-这是不应在新代码中覆盖clone
的部分原因。查看我的更新。