VB.NET中物件的克隆 (轉)

worldblog發表於2007-12-12
VB.NET中物件的克隆 (轉)[@more@]

中的克隆:namespace prefix = o ns = "urn:schemas--com::office" />

侯永鋒

  在3DMAX裡面,做好一個物體(父物體)以後,可以選擇Edit選單中的Clone,下面有三中選項:Copy(生成一個同模樣的子物體,兩者的操作互不影響),Instance(父子互動,父物體的操作同樣影響子物體,子物體也一樣),還有一個Reference(暫不考慮)。

  在VB.NET,同樣會碰到這樣的問題。建立一個複雜物件(可能有很多種不同的資料型別)的例項,進行了一系列操作之後,想讓一箇中間變數或幾個(另外的例項)儲存它的狀態,我們一般採取逐個變數賦值,有時候會寫很長的程式碼:)這實際上就是上述的Copy問題。而對於Instance,很簡單,新建一個例項,指向一下就可以了:

  Dim objA  As New CResume  ‘Cresume是一個自定義的記錄簡歷資訊的類

然後進行初始化,比如:

  objA.Name=”AAA”

  objA.Address=”Shanghai,China”

  ……

  Dim objB  As New CResume  ‘新建一個例項

  objB=objA

這樣的話,objB跟objA有相同狀態,值得注意的是objB改變一個Name,比如:

  objB.Name=”BBB”

而實際上,objA的Name也變為“BBB”,理由很簡單。它們指向同一塊空間。

下面我們重點討論物件的Clone問題,即Copy以後的各個物件互不影響,關鍵是如何採用簡單的方法解決我們的問題,MemoryStreamBinFormatter配合一下可以很簡單的把物件克隆。

MemoryStream我以前提到過,是支援區為記憶體的流。

BinFormatter主要以二進位制形式序列化和反序列化物件。

主要思路:

先用BinFormatterSerialize方法,把物件儲存在MemoryStream流中,(操作跟其他Stream一樣),然後Deserialize反序列化,得到一個流式的資料,轉化為原來物件的型別就可以了。是不是很簡單?呵呵。看一下程式碼再說:

CResume類的程式碼:

Imports System.IO

Imports System.Runtime.Serialization.Formatters

Public Class CResume 

‘注意類前面加上Serializable()屬性,否則不可以序列化

  Dim m_Name As String  '姓名

  Dim m_Address As String   '地址

  Public Property Address() As String

  Get

  Return m_Address

  End Get

  Set(ByVal NewAddress As String)

  m_Address = NewAddress

   End Set

  End Property

  Public Property Name() As String

  Get

  Return m_Name

  End Get

  Set(ByVal NewName As String)

  m_Name = NewName

  End Set

  End Property

  Public Function Clone() As CResume

  Dim BF As New Binary.BinaryFormatter()

  Dim MS As New MemoryStream()

  BF.Serialize(MS, Me)

  MS.Position = 0

  Return (CType(BF.Deserialize(MS), CResume))

  End Function

End Class

在Form裡面可以這樣

  Dim Resume1 As New CResume()

 Dim Resume2 As New CResume()

  Resume1.Name = "AAA"

  Resume1.Address = "Shanghai,China"

  Resume2 = Resume1.Clone()

  Resume1.Name = "BBB"

  Resume1.Address = "Beijing,China"

  De.WriteLine(Resume1.Name)  ‘依然是AAA

  Debug.WriteLine(Resume1.Address) 

總結:主要呼叫了VB.NET的流和序列化技術,使得物件的克隆免去了繁瑣的讀寫操作,也簡化了程式碼。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991712/,如需轉載,請註明出處,否則將追究法律責任。

相關文章