チュートリアル : Visual Basic でのオブジェクトの永続化

更新 : 2007 年 11 月

デザイン時にオブジェクトのプロパティを既定値に設定できますが、実行時に入力した値はオブジェクトが破棄されるとすべて失われます。Visual Basic では、シリアル化を使用してインスタンス間でオブジェクトのデータを永続化することで、次にそのオブジェクトのインスタンスを生成するときに値を格納および取得できます。

名前や数字などの単純なデータを格納する場合は、My.Settings オブジェクトを使用できます。詳細については、「My.Settings オブジェクト」を参照してください。

このチュートリアルでは、簡単な Loan オブジェクトを作成し、そのデータをファイルに永続化します。そして、オブジェクトの再作成時にファイルからデータを取得します。最後に、コードを変更して SOAP 形式でオブジェクトを永続化します。

et91as27.alert_security(ja-jp,VS.90).gifセキュリティに関するメモ :

次のコード例では、ファイルが存在しない場合は新規にファイルを作成します。アプリケーションがファイルを作成する必要がある場合は、フォルダの Create のアクセス許可が必要になります。アクセス許可は、アクセス制御リストを使用して設定します。ファイルが既に存在する場合、アプリケーションに必要なのは Write のアクセス許可だけです。可能な場合は、配置時にファイルを作成し、フォルダにはファイルの作成アクセスを許可せず、1 つのファイルだけに Read のアクセス許可を付与する方が安全です。また、ルート フォルダや Program Files フォルダにデータを書き込むよりも、ユーザー フォルダに書き込む方が安全です。

et91as27.alert_security(ja-jp,VS.90).gifセキュリティに関するメモ :

この例では、バイナリ形式または SOAP 形式のファイルにデータを格納します。これらの形式は、パスワードやクレジット カード情報などの重要情報には使用しないでください。

et91as27.alert_note(ja-jp,VS.90).gifメモ :

使用している設定またはエディションによっては、表示されるダイアログ ボックスやメニュー コマンドがヘルプに記載されている内容と異なる場合があります。設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。詳細については、「Visual Studio の設定」を参照してください。

Loan オブジェクトの作成

まず、Loan クラスとそのクラスを使用するテスト アプリケーションを作成します。

Loan クラスを作成するには

  1. 新しいクラス ライブラリ プロジェクトを作成して、LoanClass という名前を付けます。詳細については、「方法 : ソリューションおよびプロジェクトを作成する」を参照してください。

  2. コード エディタで、クラスの名前を Class1 から Loan に変更します。

  3. クラスに次のパブリック メンバを追加します。

    Public LoanAmount As Double = 10000.0
    Public InterestRate As Double = 7.5
    Public Term As Integer = 36
    Public Customer As String
    

次に、Loan クラスを使用する簡単なアプリケーションを作成する必要があります。

テスト アプリケーションを作成するには

  1. [ファイル] メニューの [追加] をポイントし、[新しいプロジェクト] をクリックして Windows アプリケーション プロジェクトをソリューションに追加します。

  2. [新しいプロジェクトの追加] ダイアログ ボックスで、プロジェクト名として「LoanApp」と入力し、[OK] をクリックしてダイアログ ボックスを閉じます。

  3. ソリューション エクスプローラでプロジェクトを選択します。

  4. [プロジェクト] メニューの [スタートアップ プロジェクトに設定] をクリックします。

  5. [プロジェクト] メニューの [参照の追加] をクリックします。

  6. [参照の追加] ダイアログ ボックスで、[プロジェクト] タブをクリックし、[LoanClass] プロジェクトをクリックします。

  7. [OK] をクリックし、ダイアログ ボックスを閉じます。

  8. デザイナで、フォームに 4 つの TextBox コントロールを追加します。

  9. コード エディタで、次のコードを追加します。

    Private TestLoan As New LoanClass.Loan
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
    System.EventArgs) Handles MyBase.Load
        TextBox1.Text = TestLoan.LoanAmount.ToString
        TextBox2.Text = TestLoan.InterestRate.ToString
        TextBox3.Text = TestLoan.Term.ToString
        TextBox4.Text = TestLoan.Customer
    End Sub
    

この時点で、アプリケーションをビルドして実行できます。Loan クラスの既定値が、テキスト ボックスに表示されます。利率の値を 7.5 から 7.1 に変更し、アプリケーションをいったん閉じてから再び実行してください。値が既定値の 7.5 に戻ります。

実際には利率は定期的に変わりますが、アプリケーションを実行するたびに変わるとは限りません。アプリケーションを実行するたびにユーザーが利率を更新するのではなく、アプリケーションのインスタンス間で最新の利率を保持できるようにすると便利です。次の手順では、Loan クラスにシリアル化を追加して利率を保持できるようにします。

シリアル化を使用したオブジェクトの永続化

Loan クラスの値を永続化するには、まずクラスを Serializable 属性でマークする必要があります。

シリアルできるクラスとしてクラスをマークするには

  • Loan クラスのクラス宣言を次のように変更します。

    <Serializable()> Public Class Loan
    

Serializable 属性は、クラス内のすべての要素がファイルに永続化できることをコンパイラに示します。この場合、永続化するのは InterestRate メンバのみで、Customer、LoanAmount、Period メンバは永続化の必要がない可能性があります。永続化しないクラス メンバは、NonSerialized 属性でマークできます。この例では、簡略化のために Customer 以外のすべてのメンバが永続化されます。

シリアル化の対象からメンバを除外するには

  • Customer メンバの宣言を次のように変更します。

    <NonSerialized()> Public Customer As String
    

次に、LoanApp アプリケーションにシリアル化コードを追加します。クラスをシリアル化してファイルに書き込むには、System.IO および System.Xml.Serialization 名前空間を使用します。Imports ステートメントを使用すると、完全修飾名の入力が不要です。

名前空間に参照を追加するには

  • Form1 クラスの先頭に、次の Imports ステートメントを追加します。

    Imports System.IO
    Imports System.Runtime.Serialization.Formatters.Binary
    

    この場合は、バイナリ フォーマッタを使用してバイナリ形式でオブジェクトを保存します。後でこのコードを変更して、SOAP 形式でオブジェクトを保存します。

次の手順では、オブジェクトの作成時にファイルからオブジェクトを逆シリアル化するコードを追加します。

オブジェクトを逆シリアル化するには

  1. シリアル化されたデータのファイル名として、クラスに定数を追加します。

    Const FileName As String = "SavedLoan.bin"
    
  2. Form1_Load イベント プロシージャのコードを次のように変更します。

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
    System.EventArgs) Handles MyBase.Load
        If File.Exists(FileName) Then
            Dim TestFileStream As Stream = File.OpenRead(FileName)
            Dim deserializer As New BinaryFormatter
            TestLoan = CType(deserializer.Deserialize(TestFileStream), LoanClass.Loan)
            TestFileStream.Close()
        End If
        TextBox1.Text = TestLoan.LoanAmount.ToString
        TextBox2.Text = TestLoan.InterestRate.ToString
        TextBox3.Text = TestLoan.Term.ToString
        TextBox4.Text = TestLoan.Customer
    End Sub
    

    まずファイルが存在することを確認する必要があります。ファイルが存在する場合は、バイナリ ファイルを読み取る Stream クラスと、ファイルを変換する BinaryFormatter クラスを作成します。ストリームから Loan オブジェクト型への変換には、CType メソッドを使用します。

次に、テキスト ボックスに入力されたデータを Loan クラスに保存して、クラスをファイルにシリアル化する必要のあるコードを追加します。

データを保存してクラスをシリアル化するには

  • Form1_Closing イベント プロシージャに次のコードを追加します。

    Private Sub Form1_Closing(ByVal sender As System.Object, ByVal e As _
    System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
        TestLoan.LoanAmount = CType(TextBox1.Text, Double)
        TestLoan.InterestRate = CType(TextBox2.Text, Double)
        TestLoan.Term = CType(TextBox3.Text, Integer)
        TestLoan.Customer = TextBox4.Text
    
        Dim TestFileStream As Stream = File.Create(FileName)
        Dim serializer As New BinaryFormatter
        serializer.Serialize(TestFileStream, TestLoan)
        TestFileStream.Close()
    End Sub
    

この時点で、アプリケーションを再度ビルドして実行できます。最初に既定値がテキスト ボックスに表示されます。値を変更して、4 番目のテキスト ボックスに名前を入力します。いったんアプリケーションを閉じて、再び実行します。新しい値がテキスト ボックスに表示されますが、NonSerialized としてマークした顧客名の値は表示されません。

SOAP 形式を使用したオブジェクトの永続化

これまで紹介した例では、バイナリ形式を使用してテキスト ファイルにオブジェクトを永続化する方法を説明しました。バイナリ形式は、ほとんどの Windows アプリケーションで問題なく使用できます。Web アプリケーションまたは XML Web サービスの場合は、SOAP 形式を使用して XML ファイルにオブジェクトを永続化した方がオブジェクトの共有が簡単になります。

オブジェクトを SOAP 形式で永続化するには、まず SoapFormatter クラスを参照する必要があります。SoapFormatter クラスは、自らの名前空間 System.Runtime.Serialization.Formatters.Soap にあります。

SOAP 形式を使用してオブジェクトを永続化するには

  1. ソリューション エクスプローラでプロジェクトを選択します。

  2. [プロジェクト] メニューの [参照の追加] をクリックします。

  3. [参照の追加] ダイアログ ボックスで、[.NET] タブをクリックし、System.Runtime.Serialization.Formatters.Soap コンポーネントをクリックします。

  4. [OK] をクリックし、ダイアログ ボックスを閉じます。

  5. コード エディタで、Form1 モジュールの先頭に、次の Imports ステートメントを追加します。

    Imports System.Runtime.Serialization.Formatters.Soap
    
  6. ファイル名を SavedLoan.bin から SavedLoan.xml に変更します。

  7. Form1_Load イベント プロシージャで、次の Dim ステートメントを、Dim deserializer As New BinaryFormatter から次のように変更します。

    Dim deserializer As New SoapFormatter
    
  8. Form1_Closing イベント プロシージャで、次の Dim ステートメントを、Dim serializer As New BinaryFormatter から次のように変更します。

    Dim serializer As New SoapFormatter
    

この時点で、アプリケーションをビルドしてテストできます。アプリケーションを初めて実行したときに、SavedLoan.xml ファイルが作成されます。ファイルを表示するには、ソリューション エクスプローラの [すべてのファイルを表示] を選択します。このファイルは、Windows Application プロジェクトの [Bin] ノード内にあります。

et91as27.alert_note(ja-jp,VS.90).gifメモ :

既に [すべてのファイルを表示] モードになっている場合、ファイルを表示するには、[表示] メニューの [最新の情報に更新] をクリックして最新の内容に更新する必要があります。

LoanClass の 3 つのメンバは、XML 形式で表示されます。XML ファイルで InterestRate の値を変更して保存してから、アプリケーションを再度実行してください。新しい利率が、2 番目のテキスト ボックスに表示されます。

参照

概念

PropertyBag の対応関係 (Visual Basic 6.0 ユーザー向け)

.NET Framework でのシリアル化の基礎