加速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
的部分原因。查看我的更新。