逐步解說:在 Visual Basic 中保存物件
更新:2007 年 11 月
雖然您可以在設計階段將物件屬性設定為預設值,但是當物件被毀棄時在執行階段輸入的任何值都會遺失。您可以在 Visual Basic 中使用序列化,在執行個體間保存物件的資料,可讓您儲存值並在下次執行個體化該物件時將其擷取。
若要儲存簡單資料 (例如名稱或數字),您可以使用 My.Settings 物件。如需詳細資訊,請參閱 My.Settings 物件。
在本逐步解說中,您將建立簡單的 Loan 物件,並將其資料保存至檔案。接著在重新建立物件時,您將從檔案中擷取資料。最後,您將修改程式碼,以 SOAP 格式保存物件。
安全性注意事項: |
---|
如果檔案不存在,這個範例就會建立新檔案。如果應用程式必須建立檔案,此應用程式就必須擁有資料夾的 Create 使用權限。所有的使用權限都是使用存取控制清單來設定。如果檔案已存在,應用程式只需要 Write 使用權限,也就是較低的使用權限。如果可以,更安全的做法是在部署期間建立檔案,並且只授與單一檔案的 Read 使用權限 (而不要授與資料夾的 Create 使用權限)。此外,較安全的做法是將資料寫入使用者資料夾,而不要寫入根資料夾或 [程式檔案] 資料夾。 |
安全性注意事項: |
---|
這個範例以二進位或 SOAP 格式檔儲存資料。這些格式不適用於機密資料,例如密碼或信用卡資訊。 |
注意事項: |
---|
根據目前使用的設定與版本,您所看到的對話方塊與功能表命令可能會與 [說明] 中所描述的不同。如果要變更設定,請按一下 [工具] 功能表上的 [匯入和匯出設定]。如需詳細資訊,請參閱 Visual Studio 設定。 |
建立 Loan 物件
第一步是要建立 Loan 類別和使用該類別的測試應用程式。
若要建立 Loan 類別
建立新的類別庫專案並命名為 "LoanClass"。如需詳細資訊,請參閱 HOW TO:建立方案和專案。
在 [程式碼編輯器] 中,將類別名稱從 "Class1" 變更為 "Loan"。
加入下列 Public 成員至類別中:
Public LoanAmount As Double = 10000.0 Public InterestRate As Double = 7.5 Public Term As Integer = 36 Public Customer As String
您也必須建立會使用 Loan 類別的簡單應用程式。
若要建立測試應用程式
若要將 Windows 應用程式專案加入至方案,請按一下 [檔案] 功能表,指向 [新增],然後按一下 [新增專案]。
在 [加入新的專案] 對話方塊中,輸入 LoanApp 做為專案名稱,再按一下 [確定] 關閉對話方塊。
在 [方案總管] 中選取 LoanApp 專案。
在 [專案] 功能表上,按一下 [設定為啟始專案]。
在 [專案] 功能表上,按一下 [加入參考]。
在 [加入參考] 對話方塊中,按一下 [專案] 索引標籤並選取 [LoanClass] 專案。
按一下 [確定] 關閉對話方塊。
在設計工具中,將四個 TextBox 控制項加入至表單。
在程式碼編輯器中,加入下列程式碼:
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 陳述式。
若要加入參考至命名空間
加入下列 Imports 陳述式至 Form1 類別的最上方:
Imports System.IO Imports System.Runtime.Serialization.Formatters.Binary
在這情況下,您使用二進位格式子以二進位格式儲存物件。稍後在這個逐步解說中,將修改程式碼以 SOAP 格式儲存物件。
接下來是要加入程式碼,在建立物件時從檔案還原序列化物件。
若要還原序列化物件
將常數加入至序列化資料的檔案名稱類別。
Const FileName As String = "SavedLoan.bin"
修改 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 格式保存物件
在 [方案總管] 中選取 LoanApp 專案。
在 [專案] 功能表上,按一下 [加入參考]。
在 [加入參考] 對話方塊中,按一下 [.NET] 索引標籤,然後選取 System.Runtime.Serialization.Formatters.Soap 元件。
按一下 [確定] 關閉對話方塊。
在 [程式碼編輯器] 中,將 Imports 陳述式加入至 Form1 模組的最上方:
Imports System.Runtime.Serialization.Formatters.Soap
將檔案名稱從 SavedLoan.bin 變更為 SavedLoan.xml。
在 Form1_Load 事件程序中,將 Dim 陳述式從 Dim deserializer As New BinaryFormatter 變更如下:
Dim deserializer As New SoapFormatter
在 Form1_Closing 事件程序中,將 Dim 陳述式從 Dim serializer As New BinaryFormatter 變更如下:
Dim serializer As New SoapFormatter
此時,您可以建置並測試應用程式。首次執行應用程式時,會建立 SavedLoan.xml 檔案。若要檢視檔案,請選取 [方案總管] 中的 [顯示所有檔案] 選項,它位於 Windows 應用程式專案的 [Bin] 節點中。
注意事項: |
---|
如果您已經在 [顯示所有檔案] 模式下,必須按一下 [檢視] 功能表中的 [重新整理] 重新整理檢視,才能看見檔案。 |
請注意,LoanClass 的三個成員以 XML 格式顯示。請變更並儲存 XML 檔案中的 InterestRate 值,然後再次執行應用程式。新利率將隨即出現在第二個文字方塊中。