物件的深度複製

2021-07-29 19:44:41 字數 1146 閱讀 2892

深度複製就是將引用成員指向的物件也進行複製。實際的過程是建立新的引用成員指向的物件,然後複製物件包含的資料。

深度複製可能會變得非常複雜,因為引用成員指向的物件可能包含另乙個引用型別成員,最簡單的例子就是乙個線性鍊錶。

如果乙個物件的成員包含了對於線性鍊錶結構的乙個引用,淺度複製 只複製了對頭結點的引用,深度複製 則會複製鍊錶本身,並複製每個結點上的資料。

考慮我們之前的例子,如果我們期望進行乙個深度複製,我們的clone()方法應該如何實現呢?

public

object clone()

可以看到,如果每個物件都要這樣去進行深度複製的話就太麻煩了,我們可以利用序列化/反序列化來對物件進行深度複製:先把物件序列化(serialize)到記憶體中,然後再進行反序列化,通過這種方式來進行物件的深度複製:

public

object clone()

我們來做乙個測試:

class

program ", line.rpoint.x);

console.writeline("cloned newline.rpoint.x = ", newline.rpoint.x);

line.rpoint.x = 10;   // 改變原物件 引用成員 的值

console.writeline("original line.rpoint.x = ", line.rpoint.x);

console.writeline("cloned newline.rpoint.x = ", newline.rpoint.x);}}

輸出為:

original line.rpoint.x = 1

cloned newline.rpoint.x = 1

original line.rpoint.x = 10

cloned newline.rpoint.x = 1

可見,兩個物件的引用成員已經分離,改變原物件的引用物件的值,並不影響複製後的物件。

這裡需要注意:如果想將物件進行序列化,那麼物件本身,及其所有的自定義成員(類、結構),都必須使用serializable特性進行標記。所以,如果想讓上面的**執行,我們之前定義的類都需要進行這樣的標記:

[serializable()]

public

class

refpoint 

ArcGIS物件深度複製

arcgis engine 開發中對於物件使用,每乙個物件都會分配一塊記憶體,在有些應用中想要做到物件的完全複製,希望重新分配一塊新的記憶體來對該物件進行操作,就要用到 iobjectcopy 介面。能夠通過 iobjectcopy 介面進行複製的必須能夠轉換成 ipersiststream 可以有...

js深度複製物件

js在處理複雜資料的時候,可能會涉及到引用型別的物件或者陣列的copy問題,下面是兩種複製物件或陣列的方法 一 利用jquery自帶的方法,呼叫簡單方便 淺層複製 只複製object根級的各個值 var newobject jquery.extend oldobject 深層複製 會複製整個 包括根...

淺度複製 深度複製

深度複製 deep copy 從乙個變數到另乙個變數按值複製物件,即產生乙個和原物件相同的並且沒有任何引用聯絡的物件。淺度複製 shallow copy 只複製物件的基本型別,而引用型別仍屬於原來的物件。可以使用systrm.object的memberwiseclone 方法來完成,這是乙個受保護的...