VB.net序列化和反序列化的使用方法和实用场景

引言

相信很多初学编程的人都会提出过这个疑问:"既然我的变量可以存在内存之中,那么是否也可以存在硬盘之中呢"

其实我想回答的是,完全可以而且方法不止一种,而今天讲的是序列化最经典的------二进制序列化

由于序列化的部分已经被新的.net弃用了,但是你只要明确一点,弃用不代表不可以用,以下是教学步骤

1、编写类型,或者是结构或者是一个变量

在存储单个.net变量时,一般都是被.NET程序员标记为可序列化的,然而自己写的类的变量则需要在类的头上加上这么一句话

vbnet 复制代码
<Serializable>

否则你将会看到这种情况

2、实操一下(序列化)

vbnet 复制代码
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary

Module Module1

    Sub Main()
        Do
            Dim a As String = "qwert"
            Dim b As New Class1
            Select Case Console.ReadLine()
                Case 1
                    Dim fs = New FileStream("J:\桌面文件\a.bin", FileMode.Create)
                    Dim bf = New BinaryFormatter
                    bf.Serialize(fs, a)
                    fs.Close()
                Case 2
                    Dim fs = New FileStream("J:\桌面文件\b.bin", FileMode.Create)
                    Dim bf = New BinaryFormatter
                    bf.Serialize(fs, b)
                    fs.Close()
            End Select
        Loop
    End Sub

End Module
<Serializable>
Class Class1
    Dim a As String = "asd"
    Dim b As String = "dfg"
End Class

但是,请你注意,如果你是WinForm的开发者你将会面临一个新的问题:

翻译过来就是已经被弃用了,需要加一个标签来阻止报错 #Disable Warning SYSLIB0011

即(示例代码,被标记后的代码都会隐藏此报错代码的错误)

vbnet 复制代码
#Disable Warning SYSLIB0011
    
    Public Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
        Dim fs = New FileStream(Application.StartupPath & "\Layer.bin", FileMode.Create)
        Dim bf = New BinaryFormatter
        bf.Serialize(fs, Layers)
        fs.Close()
    End Sub

    Public Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
        Dim fs = New FileStream(Application.StartupPath & "\Layer.bin", FileMode.Open)
        Dim bf = New BinaryFormatter

        Dim l = bf.Deserialize(fs)
        Layers = l
        reLoad()
        fs.Close()
    End Sub

很好,此时你的变量已经被存在桌面了

3、打开(反序列化)

和序列化一样,非常简单

vbnet 复制代码
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary

Module Module1

    Sub Main()
        Do
            Dim a As String = "qwert"
            Dim b As New Class1
            Select Case Console.ReadLine()
                Case 1
                    '''               
                Case 2
                    '''
                Case 3
                    Dim fs = New FileStream("J:\桌面文件\a.bin", FileMode.Open)
                    Dim bf = New BinaryFormatter

                    Dim a1 = bf.Deserialize(fs)
                    Console.WriteLine(a1)
                    fs.Close()
                Case 4
                    Dim fs = New FileStream("J:\桌面文件\b.bin", FileMode.Open)
                    Dim bf = New BinaryFormatter

                    Dim b1 = bf.Deserialize(fs)
                    Console.WriteLine(b1)
                    fs.Close()
            End Select

        Loop
    End Sub


End Module
<Serializable>
Class Class1
    Dim a As String = "asd"
    Dim b As String = "dfg"
End Class

输入2后,输入4的结果(由于并没有对class1做内部值的提取,故返回类名)

4、应用场景

1、在游戏

角色的位置,角色的状态,物体的状态都可以通过序列化来保存,方便第二次登录时的读取,唯一不方便的是后期数据出错维护起来麻烦(程序员可以编写对应类型的编辑器程序来维护这些可能出错的文件)

2、Socket网络编程

在进行.net的网络通信中,一个一个字节头文件识别起来非常麻烦,而且出错几率极高,而直接使用序列化后的文件传输将会大大减少编程难度和出错几率

3、对于特定类型文件的存储

例如我开发了一个CAD交互系统,我想存储所有的CAD变量,那么最简单的就是直接把自己编写的CAD类存在用户的计算机内,方便下一次修改和使用

相关推荐
課代表8 天前
VB.Net 常用函数
字符串·类型转换·数组·函数·vb.net·日期时间·条件
課代表11 天前
VB.NET 操作 INI 文件类
api·配置文件·文本·vb.net·ini·kernel32·
課代表17 天前
VB.NET 与 C# 文件操作文本到二进制文件的读写
c#·二进制文件·vb.net·streamwriter·文本文件·读写·streamreader
梵得儿SHI18 天前
Java IO 流深度解析:对象流与序列化机制(ObjectInputStream/ObjectOutputStream)
java·开发语言·rpc·序列化·对象流·对象与字节流的转换·java对象流
Ronin30525 天前
【Linux网络】应用层自定义协议
linux·网络·应用层·序列化
VB.Net1 个月前
VB.Net循序渐进(第二版)
开发语言·.net·vb.net
专注VB编程开发20年1 个月前
B.NET编写不阻塞UI线程的同步延时
ui·.net·vb.net·doevents
卷卷的小趴菜学编程1 个月前
Linux网络之----序列化和反序列化
网络·序列化·反序列化·守护进程·jsoncpp·进程组·前后台进程
专注VB编程开发20年1 个月前
VB.NET2003和VB2008可以导入VB6项目
.net·vb.net·vb6·vb2008
专注VB编程开发20年2 个月前
vb.net编写DDE(Dynamic Data Exchange)服务器
运维·服务器·github·vb.net·dde