我需要克隆我创建的对象(自定义类)。 使用标准的object.clone克隆它会很麻烦,因为它包含了对其他对象的引用,它也需要我克隆它们。使用序列化克隆Android对象
我读到克隆它的一种方法是序列化对象然后反序列化它。
这是个好主意吗?
我需要克隆我创建的对象(自定义类)。 使用标准的object.clone克隆它会很麻烦,因为它包含了对其他对象的引用,它也需要我克隆它们。使用序列化克隆Android对象
我读到克隆它的一种方法是序列化对象然后反序列化它。
这是个好主意吗?
通常,序列化用于将对象从某处(文件或网络中)发送出去,以便其他人稍后可以重新构建它们。但是你可以滥用它来立即重建物体。如果对象是可序列化的,那么重建应该是忠实的副本。
但是这种技术不能轻易使用。首先,序列化非常昂贵。它很容易比克隆()方法贵上百倍。其次,并非所有的对象都是可序列化的。第三,制作一个可串行化的类是棘手的,并不是所有的类都可以依赖于它。 (不过你可以假设系统类是正确的。)所以我相信这不是一个好主意。
您需要知道序列化会增加开销,与直接克隆相比,开销很大。你还必须确保每个班级成员(以及每个领域的每个成员......)都需要可序列化。我宁愿添加一个合适的clone()实现。
你写:
使用标准 object.clone会是麻烦的,因为它 包括对其他对象 引用,它会要求我克隆那些 太克隆它。
当你通过序列做克隆你要么
在后面的情况下,您可以实施clone()
方法,将其他对象排除在外。
除了串行化的代价,TANSTAAFL
+ 1仅用于TANSTAAFL – TommyGuns21 2013-04-17 19:20:55
我的对象已被定义为可保存目的的Serializable。我们在讨论什么样的开销?我的程序是一款游戏,每次程序运行时都需要执行一次克隆。帮助我在数据上运行“假设”场景。 – theblitz 2011-04-27 10:08:35
实现Serializable的一个主要成本是它减少了灵活性 以便在类的实现发布之后进行更改。当一个 类实现Serializable时,其字节流编码(或序列化形式) 成为其导出的API的一部分。一旦广泛分发课程,您通常需要 才能永久支持序列化表单,就像您要求 支持导出的API的所有其他部分一样。 – birdy 2011-04-27 10:41:52
实现Serializable的第二个成本是它增加了错误和安全漏洞的可能性 。通常,对象是使用构造函数创建的;序列化是创建对象的超语言机制。 – birdy 2011-04-27 10:43:36