Procédure pas à pas : persistance d'un objet (C# et Visual Basic)
Bien qu'il soit possible de définir des valeur par défaut pour les propriétés d'un objet au moment du design, les valeurs entrées lors de l'exécution sont perdues en cas de destruction de l'objet.Vous pouvez utiliser la sérialisation pour rendre les données d'un objet persistantes entre les instances, ce qui vous permet de stocker des valeurs et de les récupérer lors de la prochaine instanciation de l'objet.
[!REMARQUE]
En Visual Basic, vous pouvez utiliser l'objet My.Settings pour stocker données simples, telles qu'un nom ou un nombre.Pour plus d’informations, consultez My.Settings, objet.
Dans cette procédure pas à pas, vous allez créer un objet Loan simple et rendre ses données persistantes dans un fichier.Vous récupérerez ensuite les données du fichier lors de la recréation de l'objet.Enfin, vous allez modifier le code afin de rendre l'objet persistant dans un format SOAP.
Note de sécurité |
---|
Cet exemple crée un fichier s'il n'existe pas.Si une application doit créer un fichier, elle doit disposer de l'autorisation Create pour accéder au dossier.Les autorisations sont définies à l'aide de listes de contrôle d'accès.Si le fichier existe déjà, l'application a uniquement besoin de l'autorisation Write, ce qui représente une autorisation inférieure.Lorsque cela est possible, il est plus sûr de créer le fichier au cours du déploiement et de n'accorder l'autorisation Read que sur un seul fichier (plutôt que l'autorisation Créer sur un dossier).En outre, il est plus sûr d'écrire les données dans des dossiers utilisateur que dans le dossier racine ou le dossier Program Files. |
Note de sécurité |
---|
Cet exemple stocke les données dans un fichier au format binaire ou SOAP.Ces formats ne doivent pas être utilisés pour données sensibles, telles que les mots de passe ou les informations relatives à la carte de crédit. |
[!REMARQUE]
Les boîtes de dialogue et les commandes de menu qui s'affichent peuvent être différentes de celles qui sont décrites dans l'aide, en fonction de vos paramètres actifs ou de l'édition utilisée.Pour modifier vos paramètres, cliquez sur Importation et exportation de paramètres dans le menu Outils.Pour plus d’informations, consultez Paramètres Visual Studio.
Création de l'objet Loan
La première étape consiste à créer une classe Loan et une application de test qui utilise cette classe.
Pour créer la classe Loan
Créez un projet Bibliothèque de classes et nommez-le "LoanClass".Pour plus d’informations, consultez Création de projets et de solutions.
Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le fichier Class1, puis cliquez sur Renommer.Renommez le fichier en Loan et appuyez sur ENTRÉE.Lorsque vous renommez le fichier, la classe sera également renommée en Loan.
Ajoutez les membres publics suivants à la classe :
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; } }
Vous devrez également créer une application simple qui utilise la classe Loan.
Pour créer une application de test
Pour ajouter un projet d'application Windows Forms à votre solution, dans le menu Fichier, pointez sur Ajouter, puis cliquez sur Nouveau projet.
Dans la boîte de dialogue Ajouter un nouveau projet, entrez LoanApp comme nom du projet et cliquez sur OK pour fermer la boîte de dialogue.
Dans l'Explorateur de solutions, sélectionnez le projet LoanApp.
Dans le menu Projet, cliquez sur Définir comme projet de démarrage.
Dans le menu Projet, cliquez sur Ajouter une référence.
Dans la boîte de dialogue Ajouter une référence, cliquez sur l'onglet Projets, puis sur le projet LoanClass.
Cliquez sur OK pour fermer la boîte de dialogue.
Dans le concepteur, ajoutez quatre contrôles TextBox au formulaire.
Dans l'éditeur de code, ajoutez le code suivant :
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; }
Ajoutez un gestionnaire d'événements pour l'événement PropertyChanged au formulaire en utilisant le code suivant :
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."); }
À ce stade, vous pouvez générer et exécuter l'application.Remarquez que les valeurs par défaut de la classe Loan apparaissent dans les zones de texte.Essayez de remplacer le taux d'intérêt de 7,5 par 7,1, puis fermez l'application et exécutez-la de nouveau : le taux reprend sa valeur par défaut de 7,5.
Dans la réalité, les taux d'intérêt changent régulièrement, mais pas nécessairement chaque fois que l'application est exécutée.Plutôt que d'imposer à l'utilisateur de mettre à jour le taux d'intérêt chaque fois qu'il exécute l'application, il peut être plus judicieux de conserver le taux d'intérêt le plus récent entre les instances de l'application.C'est ce que vous ferez à l'étape suivante, en ajoutant la sérialisation à la classe Loan.
Utilisation de la sérialisation pour rendre l'objet persistant
Pour rendre les valeurs de la classe Loan persistantes, vous devez d'abord marquer la classe avec l'attribut Serializable.
Pour marquer une classe comme étant sérialisable
Modifiez la déclaration de la classe Loan de la façon suivante :
<Serializable()> Public Class Loan
[Serializable()] public class Loan : System.ComponentModel.INotifyPropertyChanged {
L'attribut Serializable indique au compilateur que tout ce que contient la classe peut être persistant dans un fichier.Étant donné que l'événement PropertyChanged est géré par un objet Windows Form, il ne peut pas être sérialisé.L'attribut NonSerialized peut être utilisé pour marquer les membres de la classe qui ne doivent pas être persistants.
Pour empêcher la sérialisation d'un membre
Modifiez la déclaration de l'événement PropertyChanged comme suit :
<NonSerialized()> Event PropertyChanged As System.ComponentModel.PropertyChangedEventHandler _ Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
[field: NonSerialized()] public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
L'étape suivante consiste à ajouter le code de sérialisation à l'application LoanApp.Afin de sérialiser la classe et de l'écrire dans un fichier, utilisez les noms d'espaces System.IO et System.Xml.Serialization.Pour éviter de taper les noms qualifiés complets, vous pouvez ajouter des références aux bibliothèques de classes requises.
Pour ajouter des références aux espaces de noms
Ajoutez les instructions suivantes au début de la classe Form1 :
Imports System.IO Imports System.Runtime.Serialization.Formatters.Binary
using System.IO; using System.Runtime.Serialization.Formatters.Binary;
Dans ce cas, vous utilisez un formateur binaire pour enregistrer l'objet dans un format binaire.Plus loin dans cette procédure, vous allez modifier le code afin d'enregistrer l'objet dans un format SOAP.
L'étape suivante consiste à ajouter le code permettant de désérialiser l'objet à partir du fichier lors de la création de l'objet.
Pour désérialiser un objet
Ajoutez une constante à la classe pour le nom de fichier des données sérialisées.
Const FileName As String = "..\..\SavedLoan.bin"
const string FileName = @"..\..\SavedLoan.bin";
Modifiez le code de la procédure événementielle Form1_Load de la façon suivante :
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; }
Remarquez que vous devez d'abord vérifier que le fichier existe.S'il existe, créez une classe Stream pour lire le fichier binaire et une classe BinaryFormatter pour convertir le fichier.Vous devez également convertir le type de flux en type d'objet Loan.
Vous devez ensuite ajouter le code permettant d'enregistrer dans la classe Loan les données saisies dans les zones de texte, puis ensuite de sérialiser la classe dans un fichier.
Pour enregistrer les données et sérialiser la classe
Ajoutez le code suivant à la procédure événementielle Form1_FormClosing :
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(); }
À ce stade, vous pouvez de nouveau générer et exécuter l'application.À l'origine, les valeurs par défaut s'affichent dans les zones de texte.Essayez de modifier les valeurs et de taper un nom dans la quatrième zone de texte.Fermez l'application et exécutez-la de nouveau.Notez que les nouvelles valeurs s'affichent maintenant dans les zones de texte.
Persistance de l'objet à l'aide d'un format SOAP
Jusqu'à présent, l'exemple a illustré la persistance d'un objet dans un fichier texte à l'aide d'un format binaire.Un tel format est parfait pour la plupart des applications Windows.Pour les applications ou les services Web, vous pouvez rendre l'objet persistant dans un fichier XML à l'aide d'un format SOAP, ce qui facilite le partage de l'objet.
Pour rendre l'objet persistant dans un format SOAP, vous devez d'abord référencer la classe SoapFormatter.La classe SoapFormatter se trouve dans son propre espace de noms : System.Runtime.Serialization.Formatters.Soap.
Pour rendre persistant l'objet à l'aide d'un format SOAP
Dans l'Explorateur de solutions, sélectionnez le projet LoanApp.
Dans le menu Projet, cliquez sur Ajouter une référence.
Dans la boîte de dialogue Ajouter une référence, cliquez sur l'onglet .NET, puis sur le composant System.Runtime.Serialization.Formatters.Soap.
Cliquez sur OK pour fermer la boîte de dialogue.
Dans l'éditeur de code, ajoutez l'instruction suivante au début du module Form1 :
Imports System.Runtime.Serialization.Formatters.Soap
using System.Runtime.Serialization.Formatters.Soap;
Remplacez le nom de fichier SavedLoan.bin par SavedLoan.xml.
Dans la procédure événementielle Form1_Load, remplacez la déclaration de la variable deserializer par l'élément suivant :
Dim deserializer As New SoapFormatter
SoapFormatter deserializer = new SoapFormatter();
Dans la procédure événementielle Form1_FormClosing, remplacez la déclaration de la variable serializer par l'élément suivant :
Dim serializer As New SoapFormatter
SoapFormatter serializer = new SoapFormatter();
À ce stade, vous pouvez générer et tester l'application.Lors de la première exécution de l'application, le fichier SavedLoan.xml est créé.Pour afficher ce fichier, sélectionnez l'option Afficher tous les fichiers dans l'Explorateur de solutions ; il se trouve sous le nœud Bin du projet d'application Windows.
[!REMARQUE]
Si le mode Afficher tous les fichiers est déjà activé, vous devez actualiser la vue en cliquant sur Actualiser dans le menu Affichage pour voir le fichier.
Remarquez que les trois membres de LoanClass s'affichent au format XML.Essayez de modifier la valeur InterestRate dans le fichier XML, enregistrez-le puis exécutez de nouveau l'application.Le nouveau taux d'intérêt s'affiche dans la deuxième zone de texte.