所有关于在视觉基础上连续化的内容

序列化是将对象转换为称为a"字节流"的线性字节序列的过程;反序列化只是反转该过程。但是为什么你想把一个对象转换成一个字节流呢?

主要原因是你可以移动物体。考虑可能性。由于"一切都是一个对象"in.NET,您可以序列化任何内容并将其保存到文件中。所以你可以序列化图片,数据文件,程序模块的当前状态('state'就像你的程序在一个时间点的快照,所以你可以暂时暂停执行并稍后再次开始)。。。无论你需要做什么。

您还可以将这些对象存储在磁盘上的文件中,通过web将它们发送到不同的程序,保留备份副本以确保安全或安全。可能性实际上是无止境的。

为什么序列化是.NET和Visual Basic中的关键过程。以下是通过实现ISerializable接口并编码aNew和aGetObjectData子例程进行自定义序列化的部分。

作为序列化的**个例子,让'做一个最简单的程序,但也是最有用的程序之一:对数据进行序列化,然后在文件中和文件中对简单类中的数据进行反序列化。在这个例子中,数据不仅被序列化,而且数据的结构也被保存。这里的结构是在一个模块中声明的,以保留东西。。。好。。。结构化的。

模块SerializeParms
Public Class ParmExample
Public Parm1 Name As String="Parm1 Name"
Public Parm1Value As Integer=12345
Public Parm2Name As String
Public Parm2Value As Decimal
End Class
End Module

然后,可以将单个值保存到这样的文件中:

进口System.Runtime.Serialization.格式。二进制
进口系统
公共类Form1
私有子mySerializeÈ点击(
ByVal发送者为系统。对象,
ByVal e为System.EventArgs)
手柄mySerialize。点击
Dim ParmData作为新的ParmExample
ParmData.Parm2Name="Parm2名称"
ParmData.parm2值=54321.12345
Dim s作为新文件流("ParmInfo",FileMode.Create)
Dim f作为新的二进制格式器
f.Serialize(s,ParmData)
s.Close()
End Sub
End Class

这些相同的值可以这样检索:

进口System.Runtime.Serialization.格式。二进制
进口系统
Public Class Form1
Private Sub-myDeserializeÈClick(U74>ByVal sender As系统。对象,
ByVal e为System.EventArgs)
手柄myDeserialize。点击
Dim s=新文件流("ParmInfo",FileMode.Open)
Dim f As New BinaryFormatter
Dim RESORTEDPARMs As New PARMEXAPLE
RESORTEDPARMs=f.Deserialize(s)
s.Close()
Console.WriteLine(RestoredParms.Parm1Name)
Console.WriteLine(RestoredParms.Parm1Value)
Console.WriteLine(RestoredParms.Parm2Name)
Console.WriteLine(RestoredParms.parm2值)
结束Sub
End Class

结构或集合(例如ArrayList)而不是也可以以相同方式序列化到文件。

小班健康知识在我们已经完成了基本的串行化过程,让我们看看下一页过程的一部分的具体细节。

关于此示例,您应该注意的**件事是Class中的属性。属性只是更多可以提供的信息VB.NET关于一个对象,他们'重新用于许多不同的事情。这个代码中的属性告诉VB.NET要添加额外的代码,以便以后可以序列化此类中的所有内容。

如果y类中有特定项目oudon't要序列化,可以使用属性排除它们:

Public Parm3Value As String="any"

在示例中,请注意,SerializeDeserializeBinaryFormatter对象的方法(在此示例中为f)。

f.Serialize(s,ParmData)

该对象采用FileStream对象并将该对象序列化为参数。我们'将会看到VB.NET提供了另一个允许将结果表示为XML的对象。

最后一点需要注意的是,如果您的对象包含其他从属对象,它们'也将被序列化!但是由于所有序列化对象必须标记为属性,因此所有这些子对象都必须标记为也是如此。

为了完全清楚您的程序中发生了什么,您可能需要在记事本中显示名为ParmData的文件,以查看序列化数据的外观。(如果您遵循此代码,则应在bin.Debug项目中的文件夹。)由于这是一个二进制文件,因此大部分内容都是't可读文本,但您应该能够在序列化文件中看到任何字符串。我们'接下来做一个XML版本,你可能想比较两者,只是为了意识到差异。

串行化为XML而不是二进制文件需要很少的更改。XML isn't速度快,可以't捕获一些对象信息,但它'更灵活。XML可以被**世界上任何其他软件技术所使用。如果您想确保您的文件结构不为't&##34;将您绑定到"Microsoft,这是一个很好的选择。Microsoft强调"LINQ到XML"创建XML数据文件采用最新技术,但许多人仍然喜欢这种方法。

XML中的'X'表示eX可伸缩。在我们的XML示例中,我们'将使用XML的这些扩展之一,这是一种称为SOAP的技术。这用于表示"简单对象访问协议"但现在它'只是一个名称。(SOAP升级得太多,原始名称不再适用了。)

我们必须在子程序中更改的主要内容是序列化格式符的删除。这必须在序列化对象的子程序和再次反序列化对象的子程序中进行更改。对于默认配置,这涉及对程序的三个更改。首先,您必须添加对该项目的引用。右键单击该项目,然后选择添加引用…。确保。。。

System.Runtime.Serialization.Formatters.Soap

... 已添加到该项目中。

然后更改引用它的程序中的两个语句。

进口System.Runtime.Serialization.Formatters.Soap

Dim f作为新的SOAPformater

这次,如果您在记事本中选中相同的ParmData文件,则可以看到整个内容都是可读的XML文本,例如。。。

Parm1 Name


12345


Parm2 Name


54321.12345

那里还有很多额外的XML,文件中的SOAP标准也需要'。如果要验证属性的作用,可以使用该属性添加变量并查看文件以验证它是否包含's。

我们刚刚编码的示例仅对数据进行序列化,但假设您需要控制数据的序列化方式。VB.NET也可以这样做!

要做到这一点,您需要更深入地了解序列化的概念。VB.NET有一个新对象可以在这里帮助:SerializationInfo。尽管您可以对自定义序列化行为进行编码,但它需要额外的编码成本。

下面显示了基本的extra代码。请记住,使用此类代替前面示例中显示的ParmExample类。这是一个完整的例子。目的是向您显示自定义序列化所需的新代码。

进口System.Runtime.Serialization

Public Class CustomSerialization
实现ISerializable
'此处序列化的数据
'Public Serializable变量为Type
Public Sub New()
'创建类
'时的默认生成器-自定义代码可以
'这里也添加了
End Sub
Public Sub New(U
ByVal info As SerializationInfo,U
ByVal context As StreamingContext)
'从
'初始化您的程序变量;串行数据存储
End Sub
Public Sub GetObjectData(U268>ByVal info As SerializationInfo,_
ByVal上下文作为精简上下文)
实现ISerializable.GetObjectData
'更新序列化数据存储
'从程序变量
End Sub
End Class

这个想法是,现在你可以(实际上你必须)在NewGetObjectData中的序列化数据存储中完成所有数据的更新和读取>子程序。您还必须包含一个通用的New生成器(无参数列表),因为您'重新实现接口。

班级通常会有正式的公关以及编码的操作和方法。。。

'通用属性
私有NewProperty value为String
Public-Property NewProperty()为String
Get
返回newPropertyValue
End Get
Set(ByVal-value为String)
newPropertyValue=value
End Set
End-Property

'通用方法
Public-Sub-MyMethod()
'方法代码
End Sub

生成的序列化类可以根据您提供的代码在文件中创建**值。例如,房地产类可能会更新房屋的价值和地址,但该类也会序列化计算出的市场分类。

317>

New子例程看起来像这样:

Public Sub-New(U327>ByVal-info为SerializationInfo,U
ByVal-context为StreamingContext)
'将程序变量初始化为
'串行数据存储
Parm1Name=info.GetString("a")
Parm1Value=info.GetInt32("b")
'新子继续…

当在BinaryFormatter对象上调用Deserialize时,将执行此子并将SerializationInfo对象传递给New子例程。然后,New可以对序列化的数据值做任何必要的事情。例如。。。

MsgBox("这是Parm1Value乘以Pi:">&(Parm1Value*数学)ToString)

当调用Serialize时发生相反的情况,但是BinaryFormatter对象调用GetObjectData

Public Sub-GetObjectData(
ByVal info As SerializationInfo,
ByVal context As StreamingContext)
实现ISerializable.GetObjectData
'如果Parm2Name=",则从程序变量
更新序列化数据存储
'测试"然后
info.AddVvalue("a","这是一个测试。")
其他
info.AddValue("a","这次没有测试。")
如果
结束info.AddValue("b",2)

请注意,数据作为名称/值对添加到序列化文件中。

我在撰写本文时发现的许多网页都有实际的工作代码。人们想知道作者有时在撰写文章之前是否实际执行了任何代码。