序列化是将对象转换为线性字节序列(称为“字节流”)的过程。反序列化只是反转该过程。但为什么要将对象转换为字节流呢?
主要原因是,您可以四处移动对象。考虑可能性。由于.NET中的“一切都是对象”,所以可以序列化任何内容并将其保存到文件中。因此,您可以序列化图片、数据文件、程序模块的当前状态(“状态”类似于程序在某个时间点的快照,因此您可以暂时暂停执行,稍后再重新启动)。。。不管你需要做什么。
您还可以将这些对象以文件的形式存储在磁盘上,通过web发送,将它们传递到其他程序,保留备份副本以确保安全。这种可能性实际上是无穷无尽的。
这就是为什么序列化在.NET和Visual Basic中是如此关键的过程。下面是通过实现ISerializable接口并编写新的和GetObjectData子例程来实现自定义序列化的一节。
作为序列化的第一个示例,让我们执行一个最简单但也是最有用的程序:序列化数据,然后在简单类中将数据反序列化到文件中。在本例中,数据不仅被序列化,而且数据的结构也被保存。这里的结构是在一个模块中声明的,以保持。。。好。。。结构化的
模块化参数<;可序列化()>;Public Class ParmExample Public Parm1Name As String=“Parm1 Name”Public Parm1Value As Integer=12345 Public parm2 Name As String Public parm2 value As DecimalEnd ClassEnd模块
然后,可以将单个值保存到如下文件中:
导入System.Runtime.Serialization.Formatters.BinaryImports System.IOPublic Class Form1 Private Sub mySerialize\u Click(\uVal sender作为System.Object,\uVal e作为System.EventArgs)处理mySerialize。单击Dim ParmData作为新ParmExample ParmData.ParmName=“Parm2 Name”ParmData.Parm2Value=54321.12345 Dim s作为新文件流(“ParmInfo”,FileMode.Create)Dim f作为新的二进制格式化程序f.Serialize(s,ParmData)s.Close()End子端类
这些相同的值可以这样检索:
导入System.Runtime.Serialization.Formatters.BinaryImports System.IOPublic Class Form1 Private Sub myDeserialize\u单击(\uByVal sender作为System.Object,\uByVal e作为System.EventArgs)\处理myDeserialize。单击Dim s=新文件流(“ParmInfo”,FileMode.Open)Dim f作为新的二进制格式化程序Dim RestoredParms作为新的ParmeExample RestoredParms=f.Deserialize(s)s.Close()Console.WriteLine(RestoredParms.Parm1Name)Console.WriteLine(RestoredParms.Parm1Value)Console.WriteLine(RestoredParms.ParmName)Console.WriteLine(RestoredParms.Parm2Value)End SubEnd类
结构或集合(如ArrayList)而不是类也可以通过同样的方式序列化为文件。
现在我们已经了解了基本的序列化过程,让我们在下一页中查看该过程的具体细节。
关于此示例,您首先应该注意的是<;可序列化()>;类中的属性。属性只是您可以向VB.NET提供的有关对象的更多信息,它们用于许多不同的事情。此代码中的属性告诉VB.NET添加额外的代码,以便以后可以序列化此类中的所有内容。
如果类中存在不希望序列化的特定项,则可以使用<;非串行化()>;属性来排除它们:
<;非串行化()>;Public Parm3Value为String=“Whatever”
在本例中,请注意Serialize和Deserialize是BinaryFormatter对象(本例中为f)的方法。
f、 序列化(s,ParmData)
此对象将FileStream对象和要序列化的对象作为参数。我们将看到VB.NET提供了另一个对象,它允许将结果表示为XML。
最后一点注意,如果您的对象包含其他从属对象,它们也将被序列化!但由于所有序列化的对象都必须标记为<;可序列化()>;属性,所有这些子对象也必须以这种方式标记。
为了完全清楚程序中发生了什么,您可能需要在记事本中显示名为ParmData的文件,以查看序列化数据的外观。(如果您遵循此代码,它应该位于项目中的bin.Debug文件夹中。)由于这是一个二进制文件,大部分内容都不是可读文本,但您应该能够看到序列化文件中的任何字符串。接下来我们将做一个XML版本,您可能想要比较这两个版本,以了解其中的差异。
序列化为XML而不是二进制文件只需要很少的更改。XML虽然速度不快,也不能捕获一些对象信息,但它要灵活得多。当今世界上几乎任何其他软件技术都可以使用XML。如果您想确保您的文件结构不会“束缚”到Microsoft,那么这是一个很好的选择。微软强调用“LINQ到XML”的最新技术来创建XML数据文件,但许多人仍然喜欢这种方法。
XML中的“X”表示可扩展。在我们的XML示例中,我们将使用其中一种XML扩展,一种称为SOAP的技术。这过去是指“简单对象访问协议”,但现在它只是一个名称。(SOAP升级太多,原来的名称已经不适合了。)
我们必须在子例程中更改的主要内容是序列化格式化程序的定义。这必须在序列化对象的子例程和再次反序列化对象的子例程中进行更改。对于默认配置,这涉及对程序的三个更改。首先,您必须添加对项目的引用。在项目上单击鼠标右键,然后选择“添加引用…”。。。。确保
System.Runtime.Serialization.Formatters.Soap
... 已添加到项目中。
然后更改程序中引用它的两条语句。
将System.Runtime.Serialization.Formatters.SoapDim f导入为新的SoapFormatter
这一次,如果您在记事本中签出相同的ParmData文件,您将看到整个文件都是可读的XML文本,例如。。。
<;Parm1Name id=“ref-3”>;Parm1名称</Parm1Name>&书信电报;Parm1Value>;12345</Parm1Value>&书信电报;Parm2Name id=“ref-4”>;Parm2名称</Parm2Name>&书信电报;Parm2Value>;54321.12345</Parm2Value>;
文件中还有许多SOAP标准所必需的附加XML。如果要验证<;非串行化()>;属性,则可以添加具有该属性的变量,并查看该文件以验证该文件是否未包含。
我们刚刚编写的示例仅序列化了数据,但假设您需要控制数据的序列化方式。VB.NET也可以做到这一点!
要实现这一点,您需要深入了解序列化的概念。VB.NET有一个新的帮助对象:SerializationInfo。尽管您可以编写自定义序列化行为的代码,但它需要额外编写代码。
基本的额外代码如下所示。记住,使用这个类而不是前面示例中显示的ParmExample类。这不是一个完整的例子。目的是向您展示自定义序列化所需的新代码。
导入System.Runtime.Serialization<;可序列化()>_公共类CustomSerialization实现ISerializable“要在此处序列化的数据”Public SerializatedVariable as Type Public Sub New()“创建类时的默认构造函数”-也可以“在此处添加自定义代码”End Sub Public Sub New(\uByVal info作为SerializationInfo,\uByVal context作为StreamingContext)'从'序列化数据存储端Sub Public子GetObjectData(\uByVal信息作为SerializationInfo,\uByVal上下文作为StreamingContext)'初始化程序变量。\从程序变量端SubEnd类实现ISerializable.GetObjectData'更新序列化数据存储'
其思想是,现在您可以(事实上,您必须)在New和GetObjectData子例程中对序列化数据存储中的数据进行所有更新和读取。您还必须包括一个通用的新构造函数(无参数列表),因为您正在实现一个接口。
该类通常具有形式属性和编码的方法。。。
'泛型PropertyPrivate newPropertyValue As StringPublic Property NewProperty()As String Get返回newPropertyValue End Get Set(ByVal value As String)newPropertyValue=value End SetEnd Property'泛型方法Public Sub MyMethod()'方法codeEnd Sub
生成的序列化类可以根据您提供的代码在文件中创建唯一的值。例如,房地产类可能会更新房屋的价值和地址,但该类也会序列化计算出的市场分类。
新的子例程将如下所示:
Public Sub New(u'ByVal info As SerializationInfo,u'ByVal context As StreamingContext)'从'序列化数据存储Parm1Name=info.GetString(“a”)Parm1Value=info.GetInt32(“b”)'初始化程序变量'新Sub继续。。。
当对BinaryFormatter对象调用反序列化时,将执行此子对象,并将SerializationInfo对象传递给新的子例程。然后,New可以对序列化的数据值执行任何必要的操作。例如
MsgBox(“这是Parm1Value乘以Pi:”(Parm1Value*Math.Pi).ToString)
调用Serialize时会发生相反的情况,但BinaryFormatter对象会调用GetObjectData。
Public Sub GetObjectData(\uByVal info作为SerializationInfo,\uByVal context作为StreamingContext)\uuIf parmName=“Test”则从程序变量中实现ISerializable.GetObjectData“更新序列化数据存储”,如果parmName=“Test”则更新info.AddValue(“a”,“这是一个测试”))否则info.AddValue(“a”,“这次没有测试”)如果info.AddValue(“b”,则结束2)
请注意,数据作为名称/值对添加到序列化文件中。
我在撰写本文时发现的许多网页似乎并没有实际的工作代码。有时,人们会怀疑作者在写文章之前是否真的执行了任何代码。
Visual Basic与Visual C++的主要区别在于Visual Basic是面向对象的编程语言,Visual C++是集成开发环境(IDE)。 visualbasic是微软开发的一种用户友好的编程语言。在visualbasic.NET发布之前,它的最终版本是visualbasic6.0。另一方面,Visual C++是...
...还有另一个名为clean的选项。在了解重建之前,了解更多有关此选项的信息非常重要。clean选项清除bin/obj目录中的所有编译文件(二进制文件)。换句话说,它从上一个构建中移除构建工件。 清洗后,重新构建,然后从头开始...
关键区别:VB代表visualbasic。它是微软的一种高级编程语言,用于快速开发基于Windows的程序。VB.NET代表支持Visual Basic网络的技术。它是Microsoft的.NET framework语言之一。这种语言是专门为VB开发人员创建的。它属于在.NET框架上实现...
...传输信息。例如,“购物车”应用程序中的表单可能包含有关购买特定项目的请求的信息。可以使用CGI将信息传递到web服务器。CGI仍然被大量使用,ASP是一个完整的替代方案,可以更好地与Visual Basic配合使用。 客户机/服务器...
...境路径中。 process.start类似于vb6中的shell命令 对于熟悉VisualBasic6的程序员,Process.Start有点像VB6shell命令。在VB 6中,您将使用以下内容: lngPID = Shell("MyTextFile.txt", vbNormalFocus) 使用process.start 您可以使用此代码启动记事本最...
在VisualBasic学生学习了所有关于循环、条件语句和子例程等的知识之后,他们经常问的下一个问题是,“如何添加位图、wav文件、自定义光标或其他特殊效果?”答案之一是资源文件。当您使用VisualStudio资源文件添加文件时,它...
...“并排显示窗口”。在Windows 7中,使用“捕捉”功能。(有关说明,请联机搜索“Windows 7功能快照”。) 9-Matthew的最重要提示:“许多程序员发现在海滩上长时间散步或大口喝一壶山露水是一种有助于清醒头脑的方式。” 当...
...程,并且不会像某些自由软件那样“瘫痪”。您可以阅读有关VBE的更多信息,并在Microsoft的网站上下载一份副本。
... 一种著名的计算机编程语言叫做VisualBasic。Microsoft Visual BASIC被认为是一种高级编程语言。它是初学者通用符号指令代码(BASIC)的后代,BASIC是一种磁盘操作系统(DOS)编程语言。Visual BASIC被认为是易学...