VB.NET串行化對象實(shí)用技巧分享
VB.NET是一款完全面向?qū)ο缶幊陶Z言。而且其特有的一些性質(zhì)對開發(fā)人員提供了相當(dāng)大的幫助。我們可以通過本文介紹的VB.NET串行化對象的相關(guān)介紹來體會這一語言的功能強(qiáng)大性,方便我們使用。#t#
只要我們運(yùn)用對象,我們就需要存儲它們的表現(xiàn)形式。也許我們暫時(shí)不需要一個(gè)對象,我們不想讓它散亂地放在內(nèi)存中。或者我們可能需要把一個(gè)對象實(shí)例從一個(gè)系統(tǒng)傳送到另一個(gè)系統(tǒng)。
對于所有這些情況,對象的狀態(tài)就需要以某種形式來體現(xiàn),可以以不定的形式保存起來,或者傳送到另一個(gè)系統(tǒng)。通常,我們把對象的狀態(tài)信息作為一系列數(shù)據(jù)字節(jié)來存儲。
存儲一個(gè)對象狀態(tài)的過程就叫做“串行化”。運(yùn)用這個(gè)狀態(tài)信息來創(chuàng)建一個(gè)新的、相等的對象實(shí)例就叫做“反串行化”。在VB6及更早的版本中,你必須編寫你自己的邏輯來執(zhí)行這些操作。盡管有這么多編程工作要做,但VB.NET串行化對象是自動的。
如果你在一個(gè)類的前面放一個(gè)屬性,那么一個(gè)對象實(shí)例就可以自動地被串行化了。你將這個(gè)屬性放置在一個(gè)類的聲明部分,如下:
- _Public Class MyClassName
 
你也可以通過實(shí)現(xiàn)一個(gè)叫做ISerializable的接口來實(shí)現(xiàn)VB.NET串行化對象,但這種方法更復(fù)雜。在大多數(shù)情況下,運(yùn)用屬性更容易,也很有效。
一旦一個(gè)類被標(biāo)記了屬性,我們就可以存儲它的狀態(tài)了。如果你運(yùn)用另一個(gè)叫做Formatter的類,你可以將一個(gè).NET對象實(shí)例的狀態(tài)作為一系列字節(jié)存儲起來,可以存儲在磁盤上或一個(gè)數(shù)據(jù)庫中,可以運(yùn)用.NET Remoting或消息隊(duì)列從一個(gè)系統(tǒng)傳送到另一個(gè)系統(tǒng)。然后,另外的那個(gè)Formatter類就可以從串行化的狀態(tài)信息“重建”對象實(shí)例了。
不同類型的VB.NET串行化對象有不同的Formatter類。BinaryFormatter保存一個(gè)對象的所有的內(nèi)部狀態(tài),包括私有變量。這就叫做“深串行化(deep serialization)”。XMLFormatter只保存公有屬性和數(shù)據(jù)成員,這個(gè)過程叫做“淺串行化(shallow serialization)”。還有用于其它目的的formatters。運(yùn)用何種formatter取決于你的對象是否有重建對象實(shí)例所必須的內(nèi)部狀態(tài)信息,以及你打算用串行化信息做什么。
Formatter對象有Serialize和Deserialize方法。Serialize方法有兩個(gè)參數(shù)——一個(gè)放置狀態(tài)信息字節(jié)的對象流和要被串行化的對象實(shí)例。Deserizlize方法對包含狀態(tài)信息字節(jié)的對象流進(jìn)行處理并將新的重建的對象實(shí)例作為一個(gè)普通的Object類型返回。然后,我們可以用CType方法將新的實(shí)例轉(zhuǎn)化成適當(dāng)?shù)念愋汀?br />
因此,要想把你的對象信息存儲到磁盤上的一個(gè)文件,你可能需要下面的邏輯:
- Dim myFileStream As New _
 - FileStream("C:\MyFileName.dat", _
 - FileMode.CreateNew)
 - Dim MyFormatter As New
 
BinaryFormatter()- MyFormatter.Serialize
 
(myFileStream, MyObject)
然后你可以用這個(gè)邏輯來重建對象:
- Dim myFileStream As
 
New _- FileStream("C:\MyFileName.dat", _
 - FileMode.Open)
 - Dim MyFormatter As New
 
BinaryFormatter()- Dim GenericObject As Object
 - GenericObject = _
 - MyFormatter.Deserialize
 
(myFileStream)- Dim MyObject As MyObjectType
 - MyObject = CType(
 
GenericObject, MyObjectType)
這時(shí)候,你就可以用這個(gè)對象了,它的行為同最初的對象實(shí)例的行為完全一樣。
有時(shí)侯,VB.NET串行化對象的過程是自動的。例如,如果把一個(gè)對象實(shí)例放在一個(gè)消息隊(duì)列上,消息隊(duì)列上的實(shí)際數(shù)據(jù)是由從串行化對象而來的狀態(tài)信息字節(jié)組成的。MessageQueue對象有一個(gè)Formatter屬性來指定所運(yùn)用的formatter類型。這就簡化了把一個(gè)對象放到一個(gè)消息隊(duì)列上的過程,只需一行代碼:
- MessageQueue1.Send
 
(objMyObjectInstance, _- "A tag string for
 
humans to read")
然后,另一個(gè)系統(tǒng)就可以從隊(duì)列上提取狀態(tài)信息,并創(chuàng)建一個(gè)相等的對象實(shí)例了。那個(gè)系統(tǒng)也必須有一個(gè)MessageQueue對象,它的Formatter屬性也必須同用來將信息放到隊(duì)列上的最初的MessageQueue對象的formatter屬性類型一致。
這有一點(diǎn)復(fù)雜。你需要兩個(gè)步驟:
- MyQueueMessage = _
 - MessageQueue1.Receive
 
(ATimeoutValue)- objMyReconstitutedInstance = _
 - CType(MyQueueMessage.Body, _
 - MyObjectsType)
 
第一步是從消息隊(duì)列提取串行化狀態(tài)信息,第二步是運(yùn)用該信息來創(chuàng)建新的、相等的對象實(shí)例。然后,我們就可以像運(yùn)用最初的對象實(shí)例一樣來運(yùn)用新的對象了。
還有更多關(guān)于處理消息隊(duì)列的資料,例如如何來處理超時(shí)設(shè)定。MSDN上的一篇名為“The Queue Continuum”的文章講述了這方面的一些細(xì)節(jié)。然而,正如你所看到的,將VB.NET串行化對象到消息隊(duì)列上以及反串行化來得到一個(gè)新的對象實(shí)例是很簡單的。















 
 
 
 
 
 
 