繁体   English   中英

如果我只能访问 object 的接口并且不可序列化,我可以克隆它吗?

[英]Can I clone an object if I have access only to its interface and is not serializable?

我有一个 object 的接口。 我不知道实现是否可序列化。 也不能克隆。 而且我没有 object 属性的吸气剂,实际上,我也不知道这些属性。

我还能克隆 object 吗? 我的意思是,我可以这样做:

public void copyMyObject(MyObject myObject){
    this.copyOfMyObject = ...//? can I make a deep copy?

}

我想不是......但也许我错过了一些东西。

这得看情况。

如果对象的实际 class 实现Serializable ... 和 rest 1 ,则可以序列化 object 。 实际类型可能与您从中获取对象引用的变量的(静态)类型不同。

但如果没有,那么你并没有错过什么。 深复制没有实现自己的深复制方法、getter 和 setter 或某种形式的序列化的 object 将涉及一些非常讨厌的编码2

你最好设计你的类,以便它们可以被序列化/克隆。 或者,这样您就不需要克隆它们。

请注意,有一些 Java 类即使通过“讨厌”的方式也无法正确克隆。 示例包括ThreadSocketClassClassLoader和一些关键的awt类。 因此,如果您的(假设的)应用程序设计依赖于(比如说)能够克隆正在运行的线程,那么该设计将无法实现。


1 - 非transient且非null的实例字段也需要可序列化。 等等。
2 - 例如,您可以想象利用破坏抽象的反射和使用Unsafe来复制 object 序列化实现在幕后所做的......没有Serializable类型检查。 不过这是个坏主意。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM