http://www.clarkrabbit.net/2008/08/course-serialize-and-deserialize-your.html
http://www.dotblogs.com.tw/jeff377/archive/2008/08/19/4953.aspx
大家有沒有遇過一個問題,就是當你想要將一個 .net 裡自行開發的一個物件存到資料庫裡或是想要保存資料到網頁上某個 hidden field 要怎麼將物件變成可以儲存的格式?
序列化(Serialize)和反序列化(Deserialize)就是在解決大家所遇到的這件事情,並且提供了許多種格式的序列化類別來幫大家節省開發 的時間。事情當然不是簡單到直接把東西丟到序列化類別中就可以處理掉完成,因為只有你自已才知道這個物件哪些要序列化、哪些不序列化、哪些屬性要在物件建 立時預先設定,所以必需要在想要被序列化的物件實作必要的method,來完全這一項序列化的工作。
以下以一個 UserInfo 物件的例子來看看怎麼開始來做序列化和反序列化這事情。一開始我們會先有一個 UserInfo 的 class 。
view plaincopy to clipboardprint?
再來,我們需要替 UserInfo 加上一個 Interface ,並實作 Interface 裡的項目,來提供序列化類別使用,結果會像這樣。
view plaincopy to clipboardprint?
好了,經過上面兩個動作以後,這個UserInfo可以被多種序列化類別使用(相關文章看這裡),為了驗證是否正確,以下使用一種類別來作序列化工作。
好了,我們終於完成序列化的準備工作,開始來測試囉!
得到結果如下:
可喜可賀,我們完成了序列化和反序列化的偉大工作,UserInfo 物件從此將可以無所不在!
====序列化各種存儲格式======================================================================
序列化是將物件狀態轉換為可保存或可傳輸格式的處理序。序列化的反面是還原序列化,它可以將資料流轉換成物件。在 .NET 程式中常用的序列化方式如下表所示。
我們撰寫一個 TBSerializerUtil 類別,來處理上述幾種序列化,TBSerializerUtil 類別包含的序列化方法如下表所示。
TBSerializerUtil 類別的完整程式碼如下
001002003004005006007008009010011012013014015016017018019020021022023024025026027028029030031032033034035036037038039040041042043044045046047048049050051052053054055056057058059060061062063064065066067068069070071072073074075076077078079080081082083084085086087088089090091092093094095096097098099100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426Imports System.Xml.Serialization
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Soap
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.Runtime.Serialization.Json
Imports System.Runtime.Serialization
Namespace [Lib]
''' <summary> ''' 物件序列化與反序化共用函式。 ''' </summary> Public Class TBSerializerUtil
''' <summary> ''' 將物件序列化為 XML 檔案。 ''' </summary> ''' <param name="Value">物件。</param> ''' <param name="FileName">檔案名稱。</param> Public Shared Sub ObjectToXmlFile(ByVal Value As Object, ByVal FileName As String)
Dim oSerializer As XmlSerializer
Dim oStream As StreamWriter
Dim sPath As String
sPath = System.IO.Path.GetDirectoryName(FileName) If Not System.IO.Directory.Exists(sPath) Then
System.IO.Directory.CreateDirectory(sPath) End If
oSerializer = New XmlSerializer(Value.GetType())
oStream = New StreamWriter(FileName)
oSerializer.Serialize(oStream, Value) oStream.Close() End Sub
''' <summary> ''' 將 XML 檔案反序列化為物件。 ''' </summary> ''' <param name="FileName">檔案名稱。</param> Public Shared Function XmlFileToObject(ByVal FileName As String, ByVal Type As System.Type) As Object
Dim oSerializer As XmlSerializer
Dim oFileStream As FileStream
Dim oValue As Object
'若指定的檔案不存在則離開 If Not System.IO.File.Exists(FileName) Then Return Nothing
oSerializer = New XmlSerializer(Type)
oFileStream = New FileStream(FileName, FileMode.Open)
'Call the Deserialize method and cast to the object type. oValue = oSerializer.Deserialize(oFileStream) oFileStream.Close() Return oValue
End Function
''' <summary> ''' 將物件序列化為 XML 字串。 ''' </summary> ''' <param name="Value">物件。</param> Public Shared Function ObjectToXml(ByVal Value As Object) As String
Dim olSerializer As XmlSerializer
Dim oMemoryStream As MemoryStream
Dim oReader As StreamReader
Dim sText As String
olSerializer = New XmlSerializer(Value.GetType())
oMemoryStream = New MemoryStream()
olSerializer.Serialize(oMemoryStream, Value) oMemoryStream.Position = 0 oReader = New StreamReader(oMemoryStream)
sText = oReader.ReadToEnd() Return sText
End Function
''' <summary> ''' 將 XML 字串反序列化為物件。 ''' </summary> ''' <param name="Text">XML 字串。</param> Public Shared Function XmlToObject(ByVal Text As String, ByVal Type As System.Type) As Object
Dim oSerializer As XmlSerializer
Dim oMemoryStream As MemoryStream
Dim oBuffer As Byte()
Dim oValue As Object
oSerializer = New XmlSerializer(Type)
oBuffer = System.Text.Encoding.UTF8.GetBytes(Text) oMemoryStream = New MemoryStream(oBuffer)
'Call the Deserialize method and cast to the object type. oValue = oSerializer.Deserialize(oMemoryStream) Return oValue
End Function
''' <summary> ''' 將物件序列化為 Soap 檔案。 ''' </summary> ''' <param name="Value">物件。</param> ''' <param name="FileName">檔案名稱。</param> Public Shared Sub ObjectToSoapFile(ByVal Value As Object, ByVal FileName As String)
Dim oFormatter As SoapFormatter
Dim oFileStream As FileStream
Dim sPath As String
sPath = System.IO.Path.GetDirectoryName(FileName) If Not System.IO.Directory.Exists(sPath) Then
System.IO.Directory.CreateDirectory(sPath) End If
oFormatter = New SoapFormatter()
oFileStream = New FileStream(FileName, FileMode.Create)
oFormatter.Serialize(oFileStream, Value) oFileStream.Close() End Sub
''' <summary> ''' 將 Soap 檔案反序列化為物件。 ''' </summary> ''' <param name="FileName">檔案名稱。</param> Public Shared Function SoapFileToObject(ByVal FileName As String, ByVal Type As System.Type) As Object
Dim oFormatter As SoapFormatter
Dim oFileStream As FileStream
Dim oValue As Object
'若指定的檔案不存在則離開 If Not System.IO.File.Exists(FileName) Then Return Nothing
oFormatter = New SoapFormatter()
oFileStream = New FileStream(FileName, FileMode.Open)
'Call the Deserialize method and cast to the object type. oValue = oFormatter.Deserialize(oFileStream) oFileStream.Close() Return oValue
End Function
''' <summary> ''' 將物件序列化為 Soap 字串。 ''' </summary> ''' <param name="Value">物件。</param> Public Shared Function ObjectToSoap(ByVal Value As Object) As String
Dim oFormatter As SoapFormatter
Dim oMemoryStream As MemoryStream
Dim oReader As StreamReader
Dim sText As String
oFormatter = New SoapFormatter()
oMemoryStream = New MemoryStream()
oFormatter.Serialize(oMemoryStream, Value) oMemoryStream.Position = 0 oReader = New StreamReader(oMemoryStream)
sText = oReader.ReadToEnd() Return sText
End Function
''' <summary> ''' 將 Soap 字串反序列化為物件。 ''' </summary> ''' <param name="Text">Soap 字串。</param> Public Shared Function SoapToObject(ByVal Text As String, ByVal Type As System.Type) As Object
Dim oFormatter As SoapFormatter
Dim oMemoryStream As MemoryStream
Dim oBuffer As Byte()
Dim oValue As Object
oFormatter = New SoapFormatter()
oBuffer = System.Text.Encoding.UTF8.GetBytes(Text) oMemoryStream = New MemoryStream(oBuffer)
'Call the Deserialize method and cast to the object type. oValue = oFormatter.Deserialize(oMemoryStream) Return oValue
End Function
''' <summary> ''' 將物件序列化為 Binary 檔案。 ''' </summary> ''' <param name="Value">物件。</param> ''' <param name="FileName">檔案名稱。</param> Public Shared Sub ObjectToBinaryFile(ByVal Value As Object, ByVal FileName As String)
Dim oFormatter As BinaryFormatter
Dim oFileStream As FileStream
Dim sPath As String
sPath = System.IO.Path.GetDirectoryName(FileName) If Not System.IO.Directory.Exists(sPath) Then
System.IO.Directory.CreateDirectory(sPath) End If
oFormatter = New BinaryFormatter()
oFileStream = New FileStream(FileName, FileMode.Create)
oFormatter.Serialize(oFileStream, Value) oFileStream.Close() End Sub
''' <summary> ''' 將 Binary 檔案反序列化為物件。 ''' </summary> ''' <param name="FileName">檔案名稱。</param> Public Shared Function BinaryFileToObject(ByVal FileName As String, ByVal Type As System.Type) As Object
Dim oFormatter As BinaryFormatter
Dim oFileStream As FileStream
Dim oValue As Object
'若指定的檔案不存在則離開 If Not System.IO.File.Exists(FileName) Then Return Nothing
oFormatter = New BinaryFormatter()
oFileStream = New FileStream(FileName, FileMode.Open)
'Call the Deserialize method and cast to the object type. oValue = oFormatter.Deserialize(oFileStream) oFileStream.Close() Return oValue
End Function
''' <summary> ''' 將物件序列化為 Binary 資料。 ''' </summary> ''' <param name="Value">物件。</param> Public Shared Function ObjectToBinary(ByVal Value As Object) As Byte()
Dim oFormatter As SoapFormatter
Dim oMemoryStream As MemoryStream
oFormatter = New SoapFormatter()
oMemoryStream = New MemoryStream()
oFormatter.Serialize(oMemoryStream, Value) oMemoryStream.Position = 0 Return oMemoryStream.GetBuffer()
End Function
''' <summary> ''' 將 Binary 資料反序列化為物件。 ''' </summary> ''' <param name="Buffer">Binary 資料。</param> Public Shared Function BinaryToObject(ByVal Buffer As Byte(), ByVal Type As System.Type) As Object
Dim oFormatter As SoapFormatter
Dim oMemoryStream As MemoryStream
Dim oValue As Object
oFormatter = New SoapFormatter()
oMemoryStream = New MemoryStream(Buffer)
'Call the Deserialize method and cast to the object type. oValue = oFormatter.Deserialize(oMemoryStream) Return oValue
End Function
''' <summary> ''' 將物件序列化為 Json 檔案。 ''' </summary> ''' <param name="Value">物件。</param> ''' <param name="FileName">檔案名稱。</param> Public Shared Sub ObjectToJsonFile(ByVal Value As Object, ByVal FileName As String)
Dim oSerializer As DataContractJsonSerializer
Dim oFileStream As FileStream
Dim sPath As String
sPath = System.IO.Path.GetDirectoryName(FileName) If Not System.IO.Directory.Exists(sPath) Then
System.IO.Directory.CreateDirectory(sPath) End If
oSerializer = New DataContractJsonSerializer(Value.GetType())
oFileStream = New FileStream(FileName, FileMode.Create)
oSerializer.WriteObject(oFileStream, Value) oFileStream.Close() End Sub
''' <summary> ''' 將 Json 檔案反序列化為物件。 ''' </summary> ''' <param name="FileName">檔案名稱。</param> Public Shared Function JsonFileToObject(ByVal FileName As String, ByVal Type As System.Type) As Object
Dim oSerializer As DataContractJsonSerializer
Dim oFileStream As FileStream
Dim oValue As Object
'若指定的檔案不存在則離開 If Not System.IO.File.Exists(FileName) Then Return Nothing
oSerializer = New DataContractJsonSerializer(Type)
oFileStream = New FileStream(FileName, FileMode.Open)
'Call the Deserialize method and cast to the object type. oValue = oSerializer.ReadObject(oFileStream) oFileStream.Close() Return oValue
End Function
''' <summary> ''' 將物件序列化為 Json 字串。 ''' </summary> ''' <param name="Value">物件。</param> Public Shared Function ObjectToJson(ByVal Value As Object) As String
Dim oSerializer As DataContractJsonSerializer
Dim oMemoryStream As MemoryStream
Dim oReader As StreamReader
Dim sText As String
oSerializer = New DataContractJsonSerializer(Value.GetType)
oMemoryStream = New MemoryStream()
oSerializer.WriteObject(oMemoryStream, Value) oMemoryStream.Position = 0 oReader = New StreamReader(oMemoryStream)
sText = oReader.ReadToEnd() Return sText
End Function
''' <summary> ''' 將 Json 字串反序列化為物件。 ''' </summary> ''' <param name="Text">Json 字串。</param> Public Shared Function JsonToObject(ByVal Text As String, ByVal Type As System.Type) As Object
Dim oSerializer As DataContractJsonSerializer
Dim oMemoryStream As MemoryStream
Dim oBuffer As Byte()
Dim oValue As Object
oSerializer = New DataContractJsonSerializer(Type)
oBuffer = System.Text.Encoding.UTF8.GetBytes(Text) oMemoryStream = New MemoryStream(oBuffer)
'Call the Deserialize method and cast to the object type. oValue = oSerializer.ReadObject(oMemoryStream) Return oValue
End Function
''' <summary> ''' 將物件序列化為 DataContract 檔案。 ''' </summary> ''' <param name="Value">物件。</param> ''' <param name="FileName">檔案名稱。</param> Public Shared Sub ObjectToDataContractFile(ByVal Value As Object, ByVal FileName As String)
Dim oSerializer As DataContractSerializer
Dim oFileStream As FileStream
Dim sPath As String
sPath = System.IO.Path.GetDirectoryName(FileName) If Not System.IO.Directory.Exists(sPath) Then
System.IO.Directory.CreateDirectory(sPath) End If
oSerializer = New DataContractSerializer(Value.GetType())
oFileStream = New FileStream(FileName, FileMode.Create)
oSerializer.WriteObject(oFileStream, Value) oFileStream.Close() End Sub
''' <summary> ''' 將 DataContract 檔案反序列化為物件。 ''' </summary> ''' <param name="FileName">檔案名稱。</param> Public Shared Function DataContractFileToObject(ByVal FileName As String, ByVal Type As System.Type) As Object
Dim oSerializer As DataContractSerializer
Dim oFileStream As FileStream
Dim oValue As Object
'若指定的檔案不存在則離開 If Not System.IO.File.Exists(FileName) Then Return Nothing
oSerializer = New DataContractSerializer(Type)
oFileStream = New FileStream(FileName, FileMode.Open)
'Call the Deserialize method and cast to the object type. oValue = oSerializer.ReadObject(oFileStream) oFileStream.Close() Return oValue
End Function
''' <summary> ''' 將物件序列化為 DataContract 字串。 ''' </summary> ''' <param name="Value">物件。</param> Public Shared Function ObjectToDataContract(ByVal Value As Object) As String
Dim oSerializer As DataContractSerializer
Dim oMemoryStream As MemoryStream
Dim oReader As StreamReader
Dim sText As String
oSerializer = New DataContractSerializer(Value.GetType)
oMemoryStream = New MemoryStream()
oSerializer.WriteObject(oMemoryStream, Value) oMemoryStream.Position = 0 oReader = New StreamReader(oMemoryStream)
sText = oReader.ReadToEnd() Return sText
End Function
''' <summary> ''' 將 DataContract 字串反序列化為物件。 ''' </summary> ''' <param name="Text">Json 字串。</param> Public Shared Function DataContractToObject(ByVal Text As String, ByVal Type As System.Type) As Object
Dim oSerializer As DataContractSerializer
Dim oMemoryStream As MemoryStream
Dim oBuffer As Byte()
Dim oValue As Object
oSerializer = New DataContractSerializer(Type)
oBuffer = System.Text.Encoding.UTF8.GetBytes(Text) oMemoryStream = New MemoryStream(oBuffer)
'Call the Deserialize method and cast to the object type. oValue = oSerializer.ReadObject(oMemoryStream) Return oValue
End Function
End Class
End Namespace