VB.NET中物件的克隆 (轉)
中的克隆: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以後的各個物件互不影響,關鍵是如何採用簡單的方法解決我們的問題,MemoryStream和BinFormatter配合一下可以很簡單的把物件克隆。
MemoryStream,我以前提到過,是支援區為記憶體的流。
BinFormatter,主要以二進位制形式序列化和反序列化物件。
主要思路:
先用BinFormatter的Serialize方法,把物件儲存在MemoryStream流中,(操作跟其他Stream一樣),然後Deserialize反序列化,得到一個流式的資料,轉化為原來物件的型別就可以了。是不是很簡單?呵呵。看一下程式碼再說:
CResume類的程式碼:
Imports System.IO
Imports System.Runtime.Serialization.Formatters
‘注意類前面加上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 = "
Resume2 = Resume1.Clone()
Resume1.Name = "BBB"
Resume1.Address = "
De.WriteLine(Resume1.Name) ‘依然是AAA
Debug.WriteLine(Resume1.Address)
總結:主要呼叫了VB.NET的流和序列化技術,使得物件的克隆免去了繁瑣的讀寫操作,也簡化了程式碼。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991712/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java中的物件“克隆”Java物件
- .NET物件克隆的深究 (轉)物件
- VB.NET中的物件導向程式設計特徵 (轉)物件程式設計特徵
- 詳解 Java 中的物件克隆Java物件
- 在 JavaScript 中如何克隆物件?JavaScript物件
- 一個克隆物件的C#基類 (轉)物件C#
- js物件的深度克隆!JS物件
- 原生js實現物件的深克隆以及淺克隆JS物件
- VB.net中HOOK的應用(二) (轉)Hook
- js深度克隆物件JS物件
- 物件如何深度克隆物件
- javascript 深度克隆物件JavaScript物件
- VB.Net中文教程(6) 母子物件關係 (轉)物件
- 如何實現物件的深度克隆物件
- 物件的克隆——原型模式(四)物件原型模式
- 物件的克隆——原型模式(三)物件原型模式
- 物件的克隆——原型模式(二)物件原型模式
- 物件的克隆——原型模式(一)物件原型模式
- 在VB.NET中尋找App (轉)APP
- JavaScript深層克隆物件JavaScript物件
- js克隆一個物件JS物件
- JS型別判斷、物件克隆、陣列克隆JS型別物件陣列
- vb.net 存取資料庫中的圖片 (轉)資料庫
- vue 克隆物件時遇到的問題Vue物件
- Java 的常見 API 與物件克隆)JavaAPI物件
- js之物件深淺克隆JS物件
- 從JDK角度看物件克隆JDK物件
- JS物件深度克隆/複製JS物件
- Henry手記-VB.net WinForm中的FORM初探(二) (轉)ORM
- js中深克隆與淺克隆JS
- Java值物件或DTO克隆工具Java物件
- VB.NET中關於DataGrid顏色的自定義。 (轉)
- VB.NET聊天程式 (轉)
- VB.NET中實現"關機/休眠/重啟/登出"的類 (轉)
- js如何克隆一個節點物件JS物件
- Delphi中的類和物件 (轉)物件
- 在VB.Net中建立使用控制元件陣列 (轉)控制元件陣列
- xlua中lua物件到c#物件的轉型物件C#