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