更好的java深度复制?

更好的java深度复制?,java,serialization,java-8,deserialization,deep-copy,Java,Serialization,Java 8,Deserialization,Deep Copy,java中有没有更快的深度复制技术来深度复制对象?我的类实现了可序列化 至于现在,我正在使用: import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class ObjectCloner { // so that nobody can acc

java中有没有更快的深度复制技术来深度复制对象?我的类实现了可序列化

至于现在,我正在使用:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class ObjectCloner {
    // so that nobody can accidentally create an ObjectCloner object
    private ObjectCloner() {
    }

    // returns a deep copy of an object
    @MetricsLogger(enableSuccessMetrics = true)
    static public Object deepCopy(Object oldObj) throws Exception {

        ObjectOutputStream outputStream = null;
        ObjectInputStream objectInputStream = null;
        try {
            if (oldObj != null) {
                ByteArrayOutputStream byteArrayOutputStream =  new ByteArrayOutputStream();
                outputStream = new ObjectOutputStream(byteArrayOutputStream);
                // serialize and pass the object
                outputStream.writeObject(oldObj);
                outputStream.flush();

                ByteArrayInputStream bin = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
                objectInputStream = new ObjectInputStream(bin);
                // return the new object
                return objectInputStream.readObject();

            } else {
                return null;
            }
        } catch (Exception e) {
            throw new RankingPolicyException("Exception while cloning : ", e);
        } finally {
            if (outputStream != null && objectInputStream != null) {
                objectInputStream.close();
                outputStream.close();
            }
        }
    }
}

这工作正常,但在性能方面相当缓慢。请告诉我是否有更好的方法进行深度复制。

我不知道序列化,但如果您正在编写
java-8
,则应该使用。通常在java中,您希望按类编写自定义深度复制逻辑。某些东西是不可序列化的,ObjectOutputStream只会在找到null的地方序列化null。如果您不十分小心,这将导致难以对下游的bug进行故障排除。此外,有些对象是不可变的(如字符串),可以在两个对象之间安全地共享引用,而无需制作完整副本。1)如果对象是代码库的一部分,则可以为每个对象编写构造函数,将包含数据的对象作为输入。根据对象类,您可以调用构造函数并获取副本。2) 如果没有,则需要为每种类型的对象编写自定义深度副本。例如,要获得HashMap的深度副本,您需要对键进行迭代,并将带值的键添加到新的HashMap。@Andrew Rueckert:
ObjectOutputStream
引发异常,如果它遇到不可序列化的对象,它不会用
null
替换它。如果您遇到这样的行为,那么它已经是一个定制的
writeObject
方法了。我通常会质疑是否需要对象的深度副本。如果您遇到这样的需求,您肯定已经有更大的设计问题需要解决。