引言
相信很多初學編程的人都會提出過這個疑問:“既然我的變量可以存在內存之中,那么是否也可以存在硬盤之中呢”
其實我想回答的是,完全可以而且方法不止一種,而今天講的是序列化最經典的——二進制序列化
由于序列化的部分已經被新的.net棄用了,但是你只要明確一點,棄用不代表不可以用,以下是教學步驟
1、編寫類型,或者是結構或者是一個變量
在存儲單個.net變量時,一般都是被.NET程序員標記為可序列化的,然而自己寫的類的變量則需要在類的頭上加上這么一句話
<Serializable>
否則你將會看到這種情況
2、實操一下(序列化)
Imports System.IO
Imports System.Runtime.Serialization.Formatters.BinaryModule Module1Sub Main()DoDim a As String = "qwert"Dim b As New Class1Select Case Console.ReadLine()Case 1Dim fs = New FileStream("J:\桌面文件\a.bin", FileMode.Create)Dim bf = New BinaryFormatterbf.Serialize(fs, a)fs.Close()Case 2Dim fs = New FileStream("J:\桌面文件\b.bin", FileMode.Create)Dim bf = New BinaryFormatterbf.Serialize(fs, b)fs.Close()End SelectLoopEnd SubEnd Module
<Serializable>
Class Class1Dim a As String = "asd"Dim b As String = "dfg"
End Class
但是,請你注意,如果你是WinForm的開發者你將會面臨一個新的問題:
翻譯過來就是已經被棄用了,需要加一個標簽來阻止報錯?#Disable Warning SYSLIB0011
即(示例代碼,被標記后的代碼都會隱藏此報錯代碼的錯誤)
#Disable Warning SYSLIB0011Public Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.ClickDim fs = New FileStream(Application.StartupPath & "\Layer.bin", FileMode.Create)Dim bf = New BinaryFormatterbf.Serialize(fs, Layers)fs.Close()End SubPublic Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.ClickDim fs = New FileStream(Application.StartupPath & "\Layer.bin", FileMode.Open)Dim bf = New BinaryFormatterDim l = bf.Deserialize(fs)Layers = lreLoad()fs.Close()End Sub
很好,此時你的變量已經被存在桌面了
3、打開(反序列化)
和序列化一樣,非常簡單
Imports System.IO
Imports System.Runtime.Serialization.Formatters.BinaryModule Module1Sub Main()DoDim a As String = "qwert"Dim b As New Class1Select Case Console.ReadLine()Case 1''' Case 2'''Case 3Dim fs = New FileStream("J:\桌面文件\a.bin", FileMode.Open)Dim bf = New BinaryFormatterDim a1 = bf.Deserialize(fs)Console.WriteLine(a1)fs.Close()Case 4Dim fs = New FileStream("J:\桌面文件\b.bin", FileMode.Open)Dim bf = New BinaryFormatterDim b1 = bf.Deserialize(fs)Console.WriteLine(b1)fs.Close()End SelectLoopEnd SubEnd Module
<Serializable>
Class Class1Dim a As String = "asd"Dim b As String = "dfg"
End Class
輸入2后,輸入4的結果(由于并沒有對class1做內部值的提取,故返回類名)
?
4、應用場景
1、在游戲
角色的位置,角色的狀態,物體的狀態都可以通過序列化來保存,方便第二次登錄時的讀取,唯一不方便的是后期數據出錯維護起來麻煩(程序員可以編寫對應類型的編輯器程序來維護這些可能出錯的文件)
2、Socket網絡編程
在進行.net的網絡通信中,一個一個字節頭文件識別起來非常麻煩,而且出錯幾率極高,而直接使用序列化后的文件傳輸將會大大減少編程難度和出錯幾率
3、對于特定類型文件的存儲
例如我開發了一個CAD交互系統,我想存儲所有的CAD變量,那么最簡單的就是直接把自己編寫的CAD類存在用戶的計算機內,方便下一次修改和使用