2011-04-27 50 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