クラスや構造体のデータをそのままファイルに登録し、再度読み込んで利用したい場合があります。 この様な時に、クラスや構造体をそのままシリアライズ化し、バイナリ形式でファイルに書き込むことでできます。
今回は簡単な例として、クラスは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
コメント