忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

クラスや構造体のそのままのデータをシリアライズ化して保存する方法

クラスや構造体のデータをそのままファイルに登録し、再度読み込んで利用したい場合があります。 この様な時に、クラスや構造体をそのままシリアライズ化し、バイナリ形式でファイルに書き込むことでできます。

今回は簡単な例として、クラスは3個のパブリックな要素を持っています。 このクラスにデータを書込むときには、3個の変数にデータを設定してから、 バイナリファイルへの書込関数と、バイナリファイルからの読込関数を呼出しています。 但し、クラスの宣言には <Serializable()> が必要です。

バイナリファイルへの書込関数では、指定されたファイルを FileStream クラスで生成オープンして、 BinaryFormatter クラスでシリアライズ化を行って書き込みます。

バイナリファイルからの読込関数でも、同様に指定されたファイルを FileStream クラスでオープンして、 BinaryFormatter クラスでストリームからのデータを逆シリアライズ化を行って読み込みます。

尚、この例を示すために、3個のボタンを貼り、テストの実行を行います。

クラスや構造体のそのままのデータをシリアライズ化して保存する方法

Public Class frmSerialize

    ''' 
    ''' シリアライズ化を行うクラス(仮のクラス)
    ''' 
    <Serializable()> _
    Public Class DataClass
        Public intNo As Integer     '番号
        Public strData1 As String   'データ1
        Public strData2 As String   'データ2
    End Class

    ''' 
    ''' シリアライズ化関数
    ''' 
    ''' <param name="strFileName">書込みファイル名</param>
    ''' <param name="objPara">シリアライズ化するオブジェクト</param>
    ''' True:OK、False:NG
    Public Function WriteObj(ByVal strFileName As String, ByVal objPara As Object) As Boolean
        '指定されたファイルをFileStreamクラスで生成オープン
        Dim fs As New System.IO.FileStream(strFileName, System.IO.FileMode.Create)
        'BinaryFormatterクラス(オブジェクトのバイナリ形式でシリアル化および逆シリアル化クラス)
        Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
        Try
            'オブジェクトをバイナリ形式でシリアル化
            bf.Serialize(fs, objPara)
            Return True
        Catch ex As Runtime.Serialization.SerializationException
            Return False
        Finally
            fs.Close()
        End Try
    End Function

    ''' 
    ''' デシリアライズ関数
    ''' 
    ''' <param name="strFileName">読込みファイル名</param>
    ''' <param name="objPara">結果を返すオブジェクト</param>
    ''' True:OK、False:NG
    Public Function ReadObj(ByVal strFileName As String, ByRef objPara As Object) As Boolean
        '指定されたファイルをFileStreamクラスでオープン
        Dim fs As New System.IO.FileStream(strFileName, System.IO.FileMode.Open)
        'BinaryFormatterクラス(オブジェクトのバイナリ形式でシリアル化および逆シリアル化クラス)
        Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
        Try
            '指定されたオブジェクトを逆シリアル化し、指定オブジェクトに返す
            objPara = bf.Deserialize(fs)
            Return True
        Catch ex As Runtime.Serialization.SerializationException
            Return False
        Finally
            fs.Close()
        End Try
    End Function

    ' ***** これ以降は上記の関数等をテストするボタン処理 *****
    ' [シリアライズ化]ボタン処理
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'クラスのインスタンス宣言
        Dim dc As New DataClass
        'クラスにデータ設定
        dc.intNo = TextBox1.Text
        dc.strData1 = TextBox2.Text
        dc.strData2 = TextBox3.Text
        'シリアライズ化(ファイルはデフォルトの位置)
        Dim blnRet As Boolean = WriteObj("DataFile.dat", dc)
    End Sub

    ' [逆シリアライズ化]ボタン処理
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim obj As Object = Nothing
        Dim blnRet As Boolean = ReadObj("DataFile.dat", obj)
        If blnRet = True Then
            Dim dc As DataClass = DirectCast(obj, DataClass)
            TextBox1.Text = dc.intNo
            TextBox2.Text = dc.strData1
            TextBox3.Text = dc.strData2
        End If
    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        TextBox1.Text = ""
        TextBox2.Text = ""
        TextBox3.Text = ""
    End Sub
End Class


結果これを実行すると以下の様になります。

関連する記事

バイト配列を介したバイナリファイルの読込・書込処理について











PR

コメント

コメントを書く