Exemplarische Vorgehensweise: Beibehalten eines Objekts (C# und Visual Basic)
Die Eigenschaften eines Objekts lassen sich zwar zur Entwurfszeit auf einen Standardwert festlegen, zur Laufzeit eingegebene Werte gehen jedoch beim Zerstören des Objekts verloren. Sie können die Serialisierung verwenden, um die Daten eines Objekts zwischen Instanzen beizubehalten. Dadurch können Werte gespeichert und bei der nächsten Instanziierung des Objekts abgerufen werden.
Tipp
In Visual Basic können Sie zum Speichern einfacher Daten, wie z. B. eines Namens oder einer Zahl, das My.Settings-Objekt verwenden. Weitere Informationen finden Sie unter My.Settings-Objekt (Visual Basic).
In dieser exemplarischen Vorgehensweise wird ein einfaches Loan-Objekt erstellt und dessen Daten in einer Datei beibehalten. Die Daten werden aus der Datei abgerufen, wenn das Objekt neu erstellt wird. Abschließend wird der Code geändert, um das Objekt in einem SOAP-Format beizubehalten.
Sicherheitshinweis |
---|
Mit diesem Beispiel wird eine neue Datei erstellt, wenn diese noch nicht vorhanden ist. Zum Erstellen von Dateien benötigt eine Anwendung die Create-Berechtigung für den Ordner. Berechtigungen werden mit Zugriffssteuerungslisten festgelegt. Wenn die Datei bereits vorhanden ist, benötigt die Anwendung lediglich eine (geringere) Write-Berechtigung. Aus Sicherheitsgründen sollte die Datei während der Bereitstellung erstellt werden. Außerdem sollte nur die Read-Berechtigung für eine einzelne Datei erteilt werden (statt der Erstellungsberechtigungen für einen Ordner). Darüber hinaus ist es sicherer, Daten in Benutzerordner statt in den Stammordner oder den Ordner Programme zu schreiben. |
Sicherheitshinweis |
---|
In diesem Beispiel werden Daten in eine Datei mit binärem oder SOAP-Format geschrieben. Diese Formate dürfen nicht für vertrauliche Daten, z. B. Kennwörter oder Kreditkarteninformationen, verwendet werden. |
Tipp
Je nach den aktiven Einstellungen oder der Version unterscheiden sich die Dialogfelder und Menübefehle auf Ihrem Bildschirm möglicherweise von den in der Hilfe beschriebenen. Klicken Sie im Menü Extras auf Einstellungen importieren und exportieren, um die Einstellungen zu ändern. Weitere Informationen finden Sie unter Visual Studio-Einstellungen.
Erstellen des Loan-Objekts
Zunächst wird eine Loan-Klasse erstellt und dann eine Testanwendung, die die Klasse verwendet.
So erstellen Sie die Loan-Klasse
Erstellen Sie ein neues Class Library-Projekt, und nennen Sie es "LoanClass". Weitere Informationen finden Sie unter Gewusst wie: Erstellen von Projektmappen und Projekten.
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Datei Class1, und klicken Sie auf Umbenennen. Benennen Sie die Datei in Loan um, und drücken Sie die EINGABETASTE. Durch das Umbenennen der Datei wird auch die Klasse in Loan umbenannt.
Fügen Sie der Klasse die folgenden öffentlichen Member hinzu:
Public Class Loan Implements System.ComponentModel.INotifyPropertyChanged Public Property LoanAmount As Double Public Property InterestRate As Double Public Property Term As Integer Private p_Customer As String Public Property Customer As String Get Return p_Customer End Get Set(ByVal value As String) p_Customer = value RaiseEvent PropertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs("Customer")) End Set End Property Event PropertyChanged As System.ComponentModel.PropertyChangedEventHandler _ Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged Public Sub New(ByVal loanAmount As Double, ByVal interestRate As Double, ByVal term As Integer, ByVal customer As String) Me.LoanAmount = loanAmount Me.InterestRate = interestRate Me.Term = term p_Customer = customer End Sub End Class
public class Loan : System.ComponentModel.INotifyPropertyChanged { public double LoanAmount {get; set;} public double InterestRate {get; set;} public int Term {get; set;} private string p_Customer; public string Customer { get { return p_Customer; } set { p_Customer = value; PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs("Customer")); } } public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; public Loan(double loanAmount, double interestRate, int term, string customer) { this.LoanAmount = loanAmount; this.InterestRate = interestRate; this.Term = term; p_Customer = customer; } }
Sie müssen ebenfalls eine einfache Anwendung erstellen, die die Loan-Klasse verwendet.
So erstellen Sie eine Testanwendung
Um der Projektmappe ein Windows Forms-Anwendungsprojekt hinzuzufügen, zeigen Sie im Menü Datei auf Hinzufügen, und klicken anschließend auf Neues Projekt.
Geben Sie im Dialogfeld Neues Projekt hinzufügen LoanApp als Namen für das Projekt ein, und klicken Sie auf OK, um das Dialogfeld zu schließen.
Wählen Sie im Projektmappen-Explorer das LoanApp-Projekt aus.
Klicken Sie im Menü Projekt auf Als Startprojekt festlegen.
Klicken Sie im Menü Projekt auf Verweis hinzufügen.
Klicken Sie im Dialogfeld Verweis hinzufügen auf die Registerkarte Projekte, und wählen Sie das Projekt LoanClass aus.
Klicken Sie auf OK, um das Dialogfeld zu schließen.
Fügen Sie im Designer vier TextBox-Steuerelemente in das Formular ein.
Fügen Sie im Code-Editor folgenden Code hinzu:
Private WithEvents TestLoan As New LoanClass.Loan(10000.0, 0.075, 36, "Neil Black") Private Sub Form1_Load() Handles MyBase.Load TextBox1.Text = TestLoan.LoanAmount.ToString TextBox2.Text = TestLoan.InterestRate.ToString TextBox3.Text = TestLoan.Term.ToString TextBox4.Text = TestLoan.Customer End Sub
private LoanClass.Loan TestLoan = new LoanClass.Loan(10000.0, 0.075, 36, "Neil Black"); private void Form1_Load(object sender, EventArgs e) { textBox1.Text = TestLoan.LoanAmount.ToString(); textBox2.Text = TestLoan.InterestRate.ToString(); textBox3.Text = TestLoan.Term.ToString(); textBox4.Text = TestLoan.Customer; }
Fügen Sie dem Formular mit dem folgenden Code einen Ereignishandler für das PropertyChanged-Ereignis hinzu:
Public Sub CustomerPropertyChanged( ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs ) Handles TestLoan.PropertyChanged MsgBox(e.PropertyName & " has been changed.") End Sub
private void CustomerPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { MessageBox.Show(e.PropertyName + " has been changed."); }
An diesem Punkt können Sie die Anwendung erstellen und ausführen. Die Standardwerte aus der Loan-Klasse werden in den Textfeldern angezeigt. Ändern Sie den Zinssatz versuchsweise von 7,5 auf 7,1, schließen Sie dann die Anwendung, und führen Sie sie erneut aus. Der Wert wird auf die Standardeinstellung 7,5 zurückgesetzt.
In der Praxis werden Zinssätze in regelmäßigen Abständen geändert, jedoch nicht bei jeder Ausführung der Anwendung. Anstatt den Zinssatz bei jeder Ausführung der Anwendung vom Benutzer aktualisieren zu lassen, kann der aktuelle Zinssatz zwischen den Instanzen der Anwendung beibehalten werden. Im nächsten Schritt tun Sie genau das, indem Sie der Loan-Klasse die Funktion der Serialisierung hinzufügen.
Beibehalten des Objekts mithilfe der Serialisierung
Damit die Werte für die Loan-Klasse erhalten bleiben, müssen Sie die Klasse zunächst mit dem Serializable-Attribut versehen.
So markieren Sie eine Klasse als serialisierbar
Ändern Sie die Klassendeklaration für die Loan-Klasse wie folgt:
<Serializable()> Public Class Loan
[Serializable()] public class Loan : System.ComponentModel.INotifyPropertyChanged {
Durch das Serializable-Attribut wird dem Compiler mitgeteilt, dass der gesamte Inhalt der Klasse in einer Datei beibehalten werden kann. Da das PropertyChanged-Ereignis von einem Windows Form-Objekt verarbeitet wird, kann es nicht serialisiert werden. Mit dem NonSerialized-Attribut können die Klassenmember markiert werden, die nicht beibehalten werden sollen.
So verhindern Sie die Serialisierung eines Members
Ändern Sie die Deklaration für das PropertyChanged-Ereignis wie folgt:
<NonSerialized()> Event PropertyChanged As System.ComponentModel.PropertyChangedEventHandler _ Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
[field: NonSerialized()] public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
Danach fügen Sie der LoanApp-Anwendung den Serialisierungscode hinzu. Um die Klasse zu serialisieren und in eine Datei zu schreiben, verwenden Sie den System.IO-Namespace und den System.Xml.Serialization-Namespace. Um nicht die vollqualifizierten Namen eingeben zu müssen, können Sie Verweise auf die erforderlichen Klassenbibliotheken hinzufügen.
So fügen Sie den Namespaces Verweise hinzu
Fügen Sie am Anfang der Form1-Klasse die folgenden Anweisungen hinzu:
Imports System.IO Imports System.Runtime.Serialization.Formatters.Binary
using System.IO; using System.Runtime.Serialization.Formatters.Binary;
In diesem Fall speichern Sie das Objekt mit einem binären Formatierungsprogramm im Binärformat. Im weiteren Verlauf dieser exemplarischen Vorgehensweise ändern Sie den Code so, dass das Objekt in einem SOAP-Format gespeichert wird.
Im nächsten Schritt fügen Sie beim Erstellen des Objekts aus der Datei Code zum Aufheben der Serialisierung ein.
So deserialisieren Sie ein Objekt
Fügen Sie der Klasse eine Konstante für den Dateinamen der serialisierten Daten hinzu.
Const FileName As String = "..\..\SavedLoan.bin"
const string FileName = @"..\..\SavedLoan.bin";
Ändern Sie den Code in der Form1_Load-Ereignisprozedur wie folgt:
Private WithEvents TestLoan As New LoanClass.Loan(10000.0, 0.075, 36, "Neil Black") Private Sub Form1_Load() 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 AddHandler TestLoan.PropertyChanged, AddressOf Me.CustomerPropertyChanged TextBox1.Text = TestLoan.LoanAmount.ToString TextBox2.Text = TestLoan.InterestRate.ToString TextBox3.Text = TestLoan.Term.ToString TextBox4.Text = TestLoan.Customer End Sub
private LoanClass.Loan TestLoan = new LoanClass.Loan(10000.0, 0.075, 36, "Neil Black"); private void Form1_Load(object sender, EventArgs e) { if (File.Exists(FileName)) { Stream TestFileStream = File.OpenRead(FileName); BinaryFormatter deserializer = new BinaryFormatter(); TestLoan = (LoanClass.Loan)deserializer.Deserialize(TestFileStream); TestFileStream.Close(); } TestLoan.PropertyChanged += this.CustomerPropertyChanged; textBox1.Text = TestLoan.LoanAmount.ToString(); textBox2.Text = TestLoan.InterestRate.ToString(); textBox3.Text = TestLoan.Term.ToString(); textBox4.Text = TestLoan.Customer; }
Sie müssen zunächst prüfen, ob die Datei vorhanden ist. Falls ja, erstellen Sie eine Stream-Klasse zum Lesen der Binärdatei und eine BinaryFormatter-Klasse zum Übersetzen der Datei. Sie müssen außerdem eine Konvertierung vom stream-Typ in den Loan-Objekttyp vornehmen.
Danach müssen Sie Code zum Speichern der in die Textfelder der Loan-Klasse eingegebenen Daten hinzufügen und anschließend die Klasse in einer Datei serialisieren.
So speichern Sie die Daten und serialisieren die Klasse
Fügen Sie der Form1_FormClosing-Ereignisprozedur den folgenden Code hinzu:
Private Sub Form1_FormClosing() Handles MyBase.FormClosing TestLoan.LoanAmount = CDbl(TextBox1.Text) TestLoan.InterestRate = CDbl(TextBox2.Text) TestLoan.Term = CInt(TextBox3.Text) TestLoan.Customer = TextBox4.Text Dim TestFileStream As Stream = File.Create(FileName) Dim serializer As New BinaryFormatter serializer.Serialize(TestFileStream, TestLoan) TestFileStream.Close() End Sub
private void Form1_FormClosing(object sender, FormClosingEventArgs e) { TestLoan.LoanAmount = Convert.ToDouble(textBox1.Text); TestLoan.InterestRate = Convert.ToDouble(textBox2.Text); TestLoan.Term = Convert.ToInt32(textBox3.Text); TestLoan.Customer = textBox4.Text; Stream TestFileStream = File.Create(FileName); BinaryFormatter serializer = new BinaryFormatter(); serializer.Serialize(TestFileStream, TestLoan); TestFileStream.Close(); }
An dieser Stelle können Sie die Anwendung wieder erstellen und ausführen. Anfänglich werden in den Textfeldern die Standardwerte angezeigt. Ändern Sie versuchsweise die Werte, und geben Sie im vierten Textfeld einen Namen ein. Schließen Sie die Anwendung, und führen Sie sie erneut aus. Beachten Sie, dass die neuen Werte jetzt in den Textfeldern angezeigt werden.
Beibehalten des Objekts unter Verwendung eines SOAP-Formats
Im vorliegenden Beispiel wurde bislang demonstriert, wie ein Objekt mithilfe eines Binärformats in einer Textdatei beibehalten wird. Für die meisten Windows-Anwendungen eignet sich ein Binärformat sehr gut. Mit einem SOAP-Format kann das Objekt für Webanwendungen oder Webdienste auch in einer XML-Datei beibehalten werden. Hierdurch wird der gemeinsame Zugriff auf das Objekt vereinfacht.
Zur Beibehaltung des Objekts in einem SOAP-Format müssen Sie zunächst auf die SoapFormatter-Klasse verweisen. Die SoapFormatter-Klasse befindet sich in einem eigenen Namespace (System.Runtime.Serialization.Formatters.Soap).
So behalten Sie das Objekt im SOAP-Format bei
Wählen Sie im Projektmappen-Explorer das LoanApp-Projekt aus.
Klicken Sie im Menü Projekt auf Verweis hinzufügen.
Klicken Sie im Dialogfeld Verweis hinzufügen auf die Registerkarte .NET, und wählen Sie die System.Runtime.Serialization.Formatters.Soap-Komponente aus.
Klicken Sie auf OK, um das Dialogfeld zu schließen.
Fügen Sie im Code-Editor am Anfang des Form1-Moduls die folgende Anweisung hinzu:
Imports System.Runtime.Serialization.Formatters.Soap
using System.Runtime.Serialization.Formatters.Soap;
Ändern Sie den Dateinamen von SavedLoan.bin in SavedLoan.xml.
Ändern Sie in der Form1_Load-Ereignisprozedur die Deklaration der deserializer-Variablen wie folgt:
Dim deserializer As New SoapFormatter
SoapFormatter deserializer = new SoapFormatter();
Ändern Sie in der Form1_FormClosing-Ereignisprozedur die Deklaration der serializer-Variablen wie folgt:
Dim serializer As New SoapFormatter
SoapFormatter serializer = new SoapFormatter();
An diesem Punkt können Sie die Anwendung erstellen und testen. Bei der ersten Ausführung der Anwendung wird die Datei SavedLoan.xml erzeugt. Wählen Sie zum Anzeigen der Datei im Projektmappen-Explorer die Option Alle Dateien anzeigen aus. Die Datei befindet sich im Bin-Knoten des Windows-Anwendungsprojekts.
Tipp
Wenn Sie sich bereits im Modus Alle Dateien anzeigen befinden, müssen Sie die Ansicht aktualisieren, indem Sie im Menü Ansicht auf Aktualisieren klicken, um die Datei anzuzeigen.
Die drei Member der LoanClass werden im XML-Format angezeigt. Ändern Sie den InterestRate-Wert in der XML-Datei, speichern Sie die Datei, und führen Sie die Anwendung erneut aus. Im zweiten Textfeld wird jetzt der neue Zinssatz angezeigt.