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类存在用户的计算机内,方便下一次修改和使用

相关推荐
专注VB编程开发20年2 天前
B.NET编写不阻塞UI线程的同步延时
ui·.net·vb.net·doevents
卷卷的小趴菜学编程2 天前
Linux网络之----序列化和反序列化
网络·序列化·反序列化·守护进程·jsoncpp·进程组·前后台进程
专注VB编程开发20年3 天前
VB.NET2003和VB2008可以导入VB6项目
.net·vb.net·vb6·vb2008
专注VB编程开发20年23 天前
vb.net编写DDE(Dynamic Data Exchange)服务器
运维·服务器·github·vb.net·dde
heeheeai1 个月前
Kotlinx Serialization 指南
kotlin·序列化
专注VB编程开发20年1 个月前
vb.net COM DLL 示例,实现了所有 VB6 X86 数据类型的对应
开发语言·前端·vb.net·com·vb6·activex dll
专注VB编程开发20年1 个月前
c#vb.net动态创建二维数组
windows·c#·vb.net·二维数组
poemyang2 个月前
RPC的三大问题:跨语言、跨平台通信的终极解决方案是如何炼成的?
网络协议·rpc·序列化
thginWalker2 个月前
第7章 序列化与反序列化:JSON和Protobuf
序列化
lingggggaaaa2 个月前
小迪安全v2023学习笔记(六十二讲)—— PHP框架反序列化
笔记·学习·安全·web安全·网络安全·php·反序列化