我正在阅读 ASF 贡献者写的一篇文章,他简要提到了深度克隆对象的“旧 Java 技巧”是将其序列化,然后将其反序列化回另一个对象。当我读到这篇文章时,我停了下来,想“嘿,这很聪明。” 不幸的是,深度克隆和连载都不是这篇文章的主题,因此作者从未给出他所谈论的例子,在线搜索也没有撤回任何类似的内容。
我不得不假设,我们正在谈论的东西看起来像这样:
public class Dog implements Serializable
{
// ...
public Dog deepClone()
{
Dog dogClone = null;
try
{
FileOutputStream fout = new FileOutputStream("mydog.dat");
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(this);
oos.close();
FileInputStream fin = new FileInputStream("mydog.dat");
ObjectInputStream ois = new ObjectInputStream(fin);
dogClone = (Dog)ois.readObject();
ois.close();
return dogClone;
}
catch(Exception e)
{
// Blah
}
}
假设我可能有点偏离(加上或减去几行代码),这是深度克隆对象的普遍接受的做法吗?这种方法有什么陷阱或警告吗?
是否存在未解决的同步/并发/线程安全问题?
因为如果这是深度克隆对象的最佳实践方式,我将虔诚地使用它。