序列化(摘自Microsoft VB sample)

ContractedBlock.gif ExpandedBlockStart.gif Code
' 此类被标记为可序列化且它实现了
'
 允许自定义序列化的 ISerializable。ISerializable 要求
'
 实现 GetObjectData 方法和将在反序列化时调用的
'
 另一个构造函数。
Imports System.Runtime.Serialization

' 此属性使类可序列化。
<Serializable()> Public Class CustomSerializableClass
    
Implements ISerializable

    
' 因为此示例中使用自定义序列化,所以 
    ' 不强制 NonSerialized 属性。而是由类的编写器
    ' 根据下面的 GetObjectData 方法确定序列化哪些内容以及不序列化哪些内容。
    ' 注意,在此类中,尽管 NonSerializedVariable 被标记为 NonSerialized,
    ' 字段仍然还是被序列化了。

    
Public PublicVariable As String
    
Private privateVariable As String
    
<NonSerialized()> Public NonSerializedVariable As String


    
' 要加载到字段的值中的简单构造函数。
    Public Sub New(ByVal argx As StringByVal argy As StringByVal argz As String)
        
Me.PublicVariable = argx
        
Me.privateVariable = argy
        
Me.NonSerializedVariable = argz
    
End Sub

    
''' <summary>
    
''' 这是在反序列化过程中调用的特殊构造函数。
    
''' 注意,字段和自定义信息(如时间戳)
    
''' 都可被序列化。
    
''' </summary>
    Public Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext)
        
Me.PublicVariable = info.GetString("PublicVariable")
        
Me.privateVariable = info.GetString("privateVariable")
        
Me.NonSerializedVariable = info.GetString("NonSerializedVariable")
        
Dim d As Date = info.GetDateTime("TimeStamp")
    
End Sub

    
Public ReadOnly Property PublicProperty() As String
        
Get
            
Return privateVariable
        
End Get
    
End Property

    
Public Sub GetObjectData(ByVal info As SerializationInfo, ByVal context As StreamingContext) Implements ISerializable.GetObjectData
        
With info
            .AddValue(
"PublicVariable"Me.PublicVariable)
            .AddValue(
"privateVariable"-1)
            .AddValue(
"NonSerializedVariable"Me.NonSerializedVariable)
            .AddValue(
"TimeStamp"Date.Now)
        
End With
    
End Sub
End Class


' 版权所有 (C) Microsoft Corporation。保留所有权利。
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.Runtime.Serialization.Formatters.Soap

' 在此示例中,对象将被序列化为一个文件并从文件反序列化。
'
 如果使用 Soap 格式化程序,则文件称为 SoapFile.xml。
'
 如果使用 Binary 格式化程序,则文件称为 BinaryFile.dat。

Public Class Form1

    
' 这些变量是在 Form_Load 事件中初始化的。
    Private soapFile As String = "SoapFile.xml"
    
Private binaryFile As String = "BinaryFile.dat"
    
Private customFile As String = "CustomFile.xml"
    
Private soapPath As String
    
Private binaryPath As String
    
Private customPath As String

#Region "加载"
    
Private Sub frmMain_Load(ByVal sender As ObjectByVal e As System.EventArgs) Handles MyBase.Load, MyBase.Load
        
' 使用 System.Io 命名空间中的 Path 类
        ' 获取系统临时路径
        Dim tempPath As String = My.Computer.FileSystem.SpecialDirectories.Temp

        soapPath 
= tempPath & soapFile
        binaryPath 
= tempPath & binaryFile
        customPath 
= tempPath & customFile

        StatusStrip1.Text 
= "All files will be written to " & tempPath & "."
    
End Sub
#End Region

#Region "SOAP"
    
' 此例程创建 SerializableClass 的新实例,然后
    ' 用 SOAP 格式化程序将其序列化。
    Private Sub cmdStandardSerializationSoap_Click(ByVal sender As System.Object, _
        
ByVal e As System.EventArgs) Handles cmdStandardSerializationSoap.Click

        
' 创建要进行序列化的对象。
        Dim instance As New SerializableClass((txtX.Text), (txtY.Text), (txtZ.Text))

        
' 获取进行文件写入操作的 FileStream。
        Dim fs As New FileStream(soapPath, FileMode.OpenOrCreate)

        
' 获取 SOAP 格式化程序实例。
        Dim sf As New SoapFormatter()

        
' 序列化实例。
        sf.Serialize(fs, instance)

        
' 关闭文件并释放资源。
        fs.Close()

    
End Sub

    
' 此例程从文件反序列化一个对象,
    ' 并将其分配给一个 SerializableClass 引用。
    Private Sub cmdStandardDeserializationSoap_Click(ByVal sender As System.Object, _
         
ByVal e As System.EventArgs) Handles cmdStandardDeserializationSoap.Click

        
' 声明引用,该引用指向将被反序列化的对象。
        Dim instance As SerializableClass

        
' 获取进行文件读取操作的 FileStream。
        Dim fs As New FileStream(soapPath, FileMode.Open)

        
' 获取 SOAP 格式化程序实例。
        Dim sf As New SoapFormatter()

        
' 从文件反序列化,创建 SerializableClass 的一个实例。
        ' 必须将经过反序列化的对象强制转换为适当的类型。
        instance = CType(sf.Deserialize(fs), SerializableClass)

        
' 关闭文件并释放资源。
        fs.Close()

     
    
End Sub
#End Region

#Region "二进制"
    
' 此例程创建 SerializableClass 的一个新实例,然后
    ' 使用 Binary 格式化程序将其序列化为一个文件。
    Private Sub cmdStandardSerializationBinary_Click(ByVal sender As System.Object, _
         
ByVal e As System.EventArgs) Handles cmdStandardSerializationBinary.Click

        
' 创建要进行序列化的对象。
        Dim instance As New SerializableClass((txtX.Text), (txtY.Text), (txtZ.Text))

        
' 获取进行文件写入操作的 FileStream。
        Dim fs As New FileStream(binaryPath, FileMode.OpenOrCreate)

        
'获取 Binary 序列化程序实例
        Dim bf As New BinaryFormatter()

        
' 将实例序列化为文件。
        bf.Serialize(fs, instance)

        
' 关闭文件并释放资源。
        fs.Close()

    
End Sub

    
' 此例程从文件反序列化一个对象,
    ' 并将其分配给一个 SerializableClass 引用。
    Private Sub cmdStandardDeserializationBinary_Click(ByVal sender As System.Object, _
        
ByVal e As System.EventArgs) Handles cmdStandardDeserializationBinary.Click

        
' 声明引用,该引用指向将被反序列化的对象。
        Dim instance As SerializableClass

        
' 获取进行文件读取操作的 FileStream。
        Dim fs As New FileStream(binaryPath, FileMode.Open)

        
' 获取一个 Binary 序列化程序实例。
        Dim bf As New BinaryFormatter()

        
' 从文件反序列化一个实例。
        ' 必须将经过反序列化的对象强制转换为适当的类型。
        instance = CType(bf.Deserialize(fs), SerializableClass)

        
' 关闭文件并释放资源。
        fs.Close()

    
End Sub
#End Region

#Region "自定义"
    
' 此例程创建 CustomSerializableClass 的一个新实例,
    ' 然后利用 SOAP 格式化程序将其序列化为一个文件。 
    ' 即使 CustomSerializableClass 具有自定义序列化,
    ' 客户端代码仍与标准序列化的客户端代码相同。
    ' 不同之处在于类代码,而非客户端代码。
    Private Sub cmdCustomSerialization_Click(ByVal sender As System.Object, _
        
ByVal e As System.EventArgs) Handles cmdCustomSerialization.Click

        
' 创建要进行序列化的对象。
        Dim instance As New CustomSerializableClass((txtX.Text), (txtY.Text), (txtZ.Text))

        
' 获取进行文件写入操作的 FileStream。
        Dim fs As New FileStream(customPath, FileMode.OpenOrCreate)

        
' 获取 SOAP 格式化程序实例。
        Dim sf As New SoapFormatter()

        
' 序列化实例。
        sf.Serialize(fs, instance)

        
' 关闭文件并释放资源。
        fs.Close()

     
End Sub

    
' 此例程从文件反序列化一个对象,
    ' 并将其分配给一个 CustomSerializableClass 引用。即使
    ' CustomSerializableClass 具有自定义序列化,客户端代码仍与
    ' 标准序列化的客户端代码相同。不同之处在于类代码,
    ' 而非客户端代码。
    Private Sub cmdCustomDeserialization_Click(ByVal sender As System.Object, _
        
ByVal e As System.EventArgs) Handles cmdCustomDeserialization.Click

        
' 声明引用,该引用指向将被反序列化的对象
        Dim instance As CustomSerializableClass

        
' 获取进行文件读取操作的 FileStream。
        Dim fs As New FileStream(customPath, FileMode.Open)

        
' 获取 SOAP 格式化程序实例。
        Dim sf As New SoapFormatter()

        
' 反序列化并创建实例。
        ' 必须将经过反序列化的对象强制转换为适当的类型。
        instance = CType(sf.Deserialize(fs), CustomSerializableClass)

        
' 关闭文件并释放资源。
        fs.Close()

           
End Sub
#End Region

End Class

转载于:https://www.cnblogs.com/gaoshoubuduo/archive/2009/03/09/1407058.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值