2011-04-27 51 views
1

我需要克隆我创建的对象(自定义类)。 使用标准的object.clone克隆它会很麻烦,因为它包含了对其他对象的引用,它也需要我克隆它们。使用序列化克隆Android对象

我读到克隆它的一种方法是序列化对象然后反序列化它。

这是个好主意吗?

回答

1

通常,序列化用于将对象从某处(文件或网络中)发送出去,以便其他人稍后可以重新构建它们。但是你可以滥用它来立即重建物体。如果对象是可序列化的,那么重建应该是忠实的副本。

但是这种技术不能轻易使用。首先,序列化非常昂贵。它很容易比克隆()方法贵上百倍。其次,并非所有的对象都是可序列化的。第三,制作一个可串行化的类是棘手的,并不是所有的类都可以依赖于它。 (不过你可以假设系统类是正确的。)所以我相信这不是一个好主意。

+0

我的对象已被定义为可保存目的的Serializable。我们在讨论什么样的开销?我的程序是一款游戏,每次程序运行时都需要执行一次克隆。帮助我在数据上运行“假设”场景。 – theblitz 2011-04-27 10:08:35

+0

实现Serializable的一个主要成本是它减少了灵活性 以便在类的实现发布之后进行更改。当一个 类实现Serializable时,其字节流编码(或序列化形式) 成为其导出的API的一部分。一旦广泛分发课程,您通常需要 才能永久支持序列化表单,就像您要求 支持导出的API的所有其他部分一样。 – birdy 2011-04-27 10:41:52

+0

实现Serializable的第二个成本是它增加了错误和安全漏洞的可能性 。通常,对象是使用构造函数创建的;序列化是创建对象的超语言机制。 – birdy 2011-04-27 10:43:36

1

您需要知道序列化会增加开销,与直接克隆相比,开销很大。你还必须确保每个班级成员(以及每个领域的每个成员......)都需要可序列化。我宁愿添加一个合适的clone()实现。

1

你写:

使用标准 object.clone会是麻烦的,因为它 包括对其他对象 引用,它会要求我克隆那些 太克隆它。

当你通过序列做克隆你要么

  • 需要序列化的其他对象太(否则得到的对象是没有真正的克隆)
  • 接受克隆将是局部的(不被引用的对象)。

在后面的情况下,您可以实施clone()方法,将其他对象排除在外。

除了串行化的代价,TANSTAAFL

+0

+ 1仅用于TANSTAAFL – TommyGuns21 2013-04-17 19:20:55