共用方式為


逐步解說:在 Visual Basic 中保存物件

更新:2007 年 11 月

雖然您可以在設計階段將物件屬性設定為預設值,但是當物件被毀棄時在執行階段輸入的任何值都會遺失。您可以在 Visual Basic 中使用序列化,在執行個體間保存物件的資料,可讓您儲存值並在下次執行個體化該物件時將其擷取。

若要儲存簡單資料 (例如名稱或數字),您可以使用 My.Settings 物件。如需詳細資訊,請參閱 My.Settings 物件

在本逐步解說中,您將建立簡單的 Loan 物件,並將其資料保存至檔案。接著在重新建立物件時,您將從檔案中擷取資料。最後,您將修改程式碼,以 SOAP 格式保存物件。

安全性注意事項:

如果檔案不存在,這個範例就會建立新檔案。如果應用程式必須建立檔案,此應用程式就必須擁有資料夾的 Create 使用權限。所有的使用權限都是使用存取控制清單來設定。如果檔案已存在,應用程式只需要 Write 使用權限,也就是較低的使用權限。如果可以,更安全的做法是在部署期間建立檔案,並且只授與單一檔案的 Read 使用權限 (而不要授與資料夾的 Create 使用權限)。此外,較安全的做法是將資料寫入使用者資料夾,而不要寫入根資料夾或 [程式檔案] 資料夾。

安全性注意事項:

這個範例以二進位或 SOAP 格式檔儲存資料。這些格式不適用於機密資料,例如密碼或信用卡資訊。

注意事項:

根據目前使用的設定與版本,您所看到的對話方塊與功能表命令可能會與 [說明] 中所描述的不同。如果要變更設定,請按一下 [工具] 功能表上的 [匯入和匯出設定]。如需詳細資訊,請參閱 Visual Studio 設定

建立 Loan 物件

第一步是要建立 Loan 類別和使用該類別的測試應用程式。

若要建立 Loan 類別

  1. 建立新的類別庫專案並命名為 "LoanClass"。如需詳細資訊,請參閱 HOW TO:建立方案和專案

  2. 在 [程式碼編輯器] 中,將類別名稱從 "Class1" 變更為 "Loan"。

  3. 加入下列 Public 成員至類別中:

    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 做為專案名稱,再按一下 [確定] 關閉對話方塊。

  3. 在 [方案總管] 中選取 LoanApp 專案。

  4. 在 [專案] 功能表上,按一下 [設定為啟始專案]。

  5. 在 [專案] 功能表上,按一下 [加入參考]。

  6. 在 [加入參考] 對話方塊中,按一下 [專案] 索引標籤並選取 [LoanClass] 專案。

  7. 按一下 [確定] 關閉對話方塊。

  8. 在設計工具中,將四個 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.IOSystem.Xml.Serialization 命名空間。若要避免輸入完整名稱,可以使用 Imports 陳述式。

若要加入參考至命名空間

  • 加入下列 Imports 陳述式至 Form1 類別的最上方:

    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 類別,以便轉譯檔案。CType 方法用於從資料流轉換為 Loan 物件型別。

接下來您必須加入程式碼,以便將文字方塊中輸入的資料儲存至 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
    

此時,您可以再次建置及執行應用程式。最初預設值會出現在文字方塊中。請嘗試變更這些值,並且在第四個文字方塊中輸入名稱。關閉應用程式然後再執行一次。注意新值現在出現在文字方塊中,但標示為 NonSerialized 的客戶名稱除外。

保存使用 SOAP 格式的物件

到目前為止,這個範例已經示範如何將物件保存至使用二進位格式的文字檔中。二進位格式適用大部分的 Windows 應用程式。對於 Web 應用程式或 XML Web Service,您可能會希望將物件保存至使用 SOAP 格式的 XML 檔案,使物件易於共用。

為了要將物件保存成 SOAP 格式,首先必須參考 SoapFormatter 類別。SoapFormatter 類別位於其本身的命名空間中:System.Runtime.Serialization.Formatters.Soap

若要使用 SOAP 格式保存物件

  1. 在 [方案總管] 中選取 LoanApp 專案。

  2. 在 [專案] 功能表上,按一下 [加入參考]。

  3. 在 [加入參考] 對話方塊中,按一下 [.NET] 索引標籤,然後選取 System.Runtime.Serialization.Formatters.Soap 元件。

  4. 按一下 [確定] 關閉對話方塊。

  5. 在 [程式碼編輯器] 中,將 Imports 陳述式加入至 Form1 模組的最上方:

    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 應用程式專案的 [Bin] 節點中。

注意事項:

如果您已經在 [顯示所有檔案] 模式下,必須按一下 [檢視] 功能表中的 [重新整理] 重新整理檢視,才能看見檔案。

請注意,LoanClass 的三個成員以 XML 格式顯示。請變更並儲存 XML 檔案中的 InterestRate 值,然後再次執行應用程式。新利率將隨即出現在第二個文字方塊中。

請參閱

概念

Visual Basic 6.0 使用者可用的 PropertyBag 對等用法

.NET Framework 序列化的基本概念