VB.NET對(duì)象克隆主要思想
VB.NET編程語言中對(duì)對(duì)象的操作是比較重要的一個(gè)操作技巧,對(duì)于一個(gè)具有面向?qū)ο筇匦缘木幊陶Z言,我們要想徹底掌握這一語言的應(yīng)用,就應(yīng)當(dāng)把這些特性把握好。在這里就先來一起了解一下VB.NET對(duì)象克隆的一些基本概念。
在3DMAX里面,做好一個(gè)物體(父物體)以后,可以選擇Edit菜單中的Clone,下面有三中選項(xiàng):Copy(生成一個(gè)同模樣的子物體,兩者的操作互不影響),Instance(父子互動(dòng),父物體的操作同樣影響子物體,子物體也一樣),還有一個(gè)Reference(暫不考慮)。
在VB.NET,同樣會(huì)碰到這樣的問題。創(chuàng)建一個(gè)復(fù)雜對(duì)象(可能有很多種不同的數(shù)據(jù)類型)的實(shí)例,進(jìn)行了一系列操作之后,想讓一個(gè)中間變量或幾個(gè)(另外的實(shí)例)保存它的狀態(tài),我們一般采取逐個(gè)變量賦值,有時(shí)候會(huì)寫很長的代碼:)這實(shí)際上就是上述的Copy問題。而對(duì)于Instance,很簡單,新建一個(gè)實(shí)例,指向一下就可以了:
- Dim objA As New CResume ‘Cresume
 
是一個(gè)自定義的記錄簡歷信息的類
然后進(jìn)行初始化,比如:
- objA.Name=”AAA”
 - objA.Address=”Shanghai,China”
 - ……
 - Dim objB As New CResume ‘新建一個(gè)實(shí)例
 - objB=objA
 
這樣的話,objB跟objA有相同狀態(tài),值得注意的是objB改變一個(gè)Name,比如:
- objB.Name=”BBB”
 
而實(shí)際上,objA的Name也變?yōu)?ldquo;BBB”,理由很簡單。它們指向同一塊內(nèi)存空間。#t#
下面我們重點(diǎn)討論對(duì)象的Clone問題,即Copy以后的各個(gè)對(duì)象互不影響,關(guān)鍵是如何采用簡單的方法解決我們的問題,MemoryStream和BinFormatter配合一下可以很簡單的實(shí)現(xiàn)VB.NET對(duì)象克隆。
MemoryStream,我以前提到過,是支持存儲(chǔ)區(qū)為內(nèi)存的流。
BinFormatter,主要以二進(jìn)制形式序列化和反序列化對(duì)象。
主要思路:
先用BinFormatter的Serialize方法,把對(duì)象存儲(chǔ)在MemoryStream流中,(操作跟其他Stream一樣),然后Deserialize反序列化,得到一個(gè)流式的數(shù)據(jù),轉(zhuǎn)化為原來對(duì)象的類型就可以了。是不是很簡單?呵呵。看一下代碼再說:
CResume類的代碼:
- Imports System.IO
 - Imports System.Runtime.Serialization.Formatters
 - < Serializable()> 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里面可以這樣調(diào)用
- Dim Resume1 As New CResume()
 - Dim Resume2 As New CResume()
 - Resume1.Name = "AAA"
 - Resume1.Address = "office:smarttags" />Shanghai,China"
 - Resume2 = Resume1.Clone()
 - Resume1.Name = "BBB"
 - Resume1.Address = "Beijing,China"
 - Debug.WriteLine(Resume1.Name) ‘依然是AAA
 - Debug.WriteLine(Resume1.Address)
 
總結(jié):主要調(diào)用了VB.NET的流和序列化技術(shù),使得VB.NET對(duì)象克隆免去了繁瑣的讀寫操作,也簡化了代碼。















 
 
 
 
 
 
 