如果 Java 类实现了Serializable
接口但没有公共clone()
方法,通常可以像这样创建深拷贝:
class CloneHelper {
@SuppressWarnings("unchecked")
public static <T extends Serializable> T clone(T obj) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
oos.close();
byte[] bytes = baos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
T copy = (T) ois.readObject();
ois.close();
return copy;
} catch (ClassNotFoundException ex) {
// Shouldn't happen
throw new Error(ex);
} catch (IOException ex) {
// Probably a bug in T's custom serialization methods
throw new RuntimeException(ex);
}
}
}
我经常遇到像这样的第三方库类,并诉诸上述黑客攻击。我什至ObjectOutputStream
有时会扩展以使副本更浅。除了效率低下(编码/解码速度慢并且临时序列化图会消耗大量内存)之外,它从未引起严重问题。)
如果使用这种技术不安全,那么类可能不应该被声明Serializable
。
所以我想知道的是,如果你的类是Serializable
,什么可能会阻止你定义一个公共clone()
方法(使用Cloneable
接口或复制构造函数?)
相关:在 Java 中复制对象