Procedura dettagliata: persistenza di un oggetto (C# e Visual Basic)
Sebbene sia possibile impostare le proprietà di un oggetto sui valori predefiniti in fase di progettazione, tutti i valori immessi in fase di esecuzione verranno persi alla distruzione dell'oggetto. È possibile utilizzare la serializzazione per rendere persistenti i dati di un oggetto tra le istanze consentendo l'archiviazione e il recupero dei valori alla successiva creazione di un'istanza dell'oggetto.
Nota
Per l'archiviazione di dati semplici in Visual Basic, quali un nome o un numero, è possibile servirsi dell'oggetto My.Settings. Per ulteriori informazioni, vedere My.Settings Object.
In questa procedura dettagliata, si creerà un oggetto Loan semplice e si salveranno in modo permanente i dati in un file. Quindi, i dati verranno recuperati dal file quando l'oggetto viene ricreato. Alla fine, verrà modificato il codice per salvare in modo permanente l'oggetto in un formato SOAP.
Nota sulla sicurezza |
---|
Se il file non esiste, ne viene creato uno nuovo nell'esempio. Per poter creare un file in un'applicazione, è necessario che l'applicazione disponga di un'autorizzazione di tipo Create per la cartella. Le autorizzazioni vengono impostate tramite gli elenchi di controllo di accesso. Se il file è già esistente, l'applicazione necessita solo di un'autorizzazione di tipo Write, ossia di un'autorizzazione inferiore. Se possibile, è più sicuro creare il file durante la fase di distribuzione e concedere solo autorizzazioni Read a un unico file, anziché autorizzazioni di tipo Create per una cartella. È inoltre più sicuro scrivere i dati nelle cartelle utente anziché nella cartella radice o nella cartella Programmi. |
Nota sulla sicurezza |
---|
Nell'esempio i dati vengono memorizzati in file in formato binario o SOAP. Si consiglia di non utilizzare questi formati per dati riservati, quali password o informazioni sulle carte di credito. |
Nota
È possibile che le finestre di dialogo e i comandi di menu visualizzati siano diversi da quelli descritti nella Guida a seconda delle impostazioni attive o dell'edizione del programma. Per modificare le impostazioni, scegliere Importa/Esporta impostazioni dal menu Strumenti. Per ulteriori informazioni, vedere Impostazioni di Visual Studio.
Creazione dell'oggetto Loan
Il primo passaggio consiste nella creazione di una classe Loan e di un'applicazione di prova che utilizzi tale classe.
Per creare la classe Loan
Creare un nuovo progetto Libreria di classi cui assegnare il nome LoanClass. Per ulteriori informazioni, vedere Procedura: creare soluzioni e progetti.
In Esplora soluzioni fare clic con il pulsante destro del mouse sul file Class1 e scegliere Rinomina. Assegnare al file il nome Loan e premere INVIO. Rinominando il file, anche la classe verrà rinominata Loan.
Aggiungere i seguenti membri pubblici alla 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; } }
Sarà inoltre necessario creare un'applicazione semplice in cui venga utilizzata la classe Loan.
Per creare un'applicazione di test
Per aggiungere un progetto di applicazione Windows Forms alla soluzione, selezionare Aggiungi dal menu File, quindi scegliere Nuovo progetto.
Nella finestra di dialogo Aggiungi nuovo progetto immettere LoanApp come nome del progetto, quindi scegliere OK per chiudere la finestra di dialogo.
In Esplora soluzioni selezionare il progetto LoanApp.
Scegliere Imposta come progetto di avvio dal menu Progetto.
Scegliere Aggiungi riferimento dal menu Progetto.
Nella finestra di dialogo Aggiungi riferimento fare clic sulla scheda Progetti e selezionare il progetto LoanClass.
Scegliere OK per chiudere la finestra di dialogo.
Nella finestra di progettazione aggiungere quattro controlli TextBox al form.
Nell'editor di codice aggiungere il seguente codice:
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; }
Aggiungere al form un gestore eventi per l'evento PropertyChanged utilizzando il seguente codice:
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."); }
A questo punto è possibile compilare ed eseguire l'applicazione. Nelle caselle di testo verranno visualizzati i valori predefiniti della classe Loan. Provare a modificare il valore relativo al tasso d'interesse da 7.5 in 7.1, quindi chiudere l'applicazione ed eseguirla nuovamente. Verrà ripristinato il valore predefinito 7.5.
Nel mondo reale i tassi d'interesse variano periodicamente, ma non necessariamente ogni volta che si esegue l'applicazione. Anziché fare in modo che l'utente aggiorni il tasso d'interesse a ogni esecuzione dell'applicazione, è preferibile mantenere il valore relativo al tasso d'interesse più recente tra le istanze dell'applicazione. Tale operazione verrà effettuata nel passaggio successivo aggiungendo la serializzazione alla classe Loan.
Utilizzo della serializzazione per garantire la persistenza dell'oggetto
Per garantire la persistenza dei valori della classe Loan, è necessario contrassegnare dapprima la classe con l'attributo Serializable.
Per contrassegnare la classe come serializzabile
Modificare la dichiarazione della classe Loan nel modo seguente:
<Serializable()> Public Class Loan
[Serializable()] public class Loan : System.ComponentModel.INotifyPropertyChanged {
L'attributo Serializable indica al compilatore che tutti i dati presenti nella classe possono essere resi persistenti in un file. Poiché l'evento PropertyChanged viene gestito da un oggetto Windows Form, non può essere serializzato. È possibile utilizzare l'attributo NonSerialized per contrassegnare i membri della classe che non devono essere resi persistenti.
Per impedire la serializzazione di un membro
Modificare la dichiarazione per l'evento PropertyChanged nel modo seguente:
<NonSerialized()> Event PropertyChanged As System.ComponentModel.PropertyChangedEventHandler _ Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
[field: NonSerialized()] public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
Il passaggio successivo consiste nell'aggiungere il codice della serializzazione all'applicazione LoanApp. Per poter serializzare la classe e scriverla in un file, verranno utilizzati gli spazi dei nomi System.IO e System.Xml.Serialization. Per evitare di digitare i nomi completi, è possibile aggiungere i riferimenti alle librerie di classi necessarie.
Per aggiungere riferimenti agli spazi dei nomi
Aggiungere le seguenti istruzioni all'inizio della classe Form1:
Imports System.IO Imports System.Runtime.Serialization.Formatters.Binary
using System.IO; using System.Runtime.Serialization.Formatters.Binary;
In questo caso viene utilizzato un formattatore binario per salvare l'oggetto in un formato binario. Più avanti nella procedura dettagliata il codice verrà modificato per salvare l'oggetto in un formato SOAP.
Il passaggio successivo consiste nell'aggiungere il codice per deserializzare l'oggetto dal file durante la creazione dell'oggetto.
Per deserializzare un oggetto
Aggiungere una costante alla classe per il nome del file dei dati serializzati.
Const FileName As String = "..\..\SavedLoan.bin"
const string FileName = @"..\..\SavedLoan.bin";
Modificare il codice della routine eventi Form1_Load come riportato di seguito.
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; }
Si noti che è necessario dapprima verificare che il file esiste. Se il file esiste, creare una classe Stream per leggere il file binario e una classe BinaryFormatter per convertire il file. È inoltre necessario effettuare la conversione dal tipo di flusso al tipo di oggetto Loan.
Sarà quindi necessario aggiungere il codice per salvare nella classe Loan i dati immessi nelle caselle di testo e serializzare la classe in un file.
Per salvare i dati e serializzare la classe
Aggiungere alla routine eventi Form1_FormClosing il codice riportato di seguito.
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(); }
A questo punto è di nuovo possibile compilare ed eseguire l'applicazione. Nelle caselle di testo verranno inizialmente visualizzati i valori predefiniti. Provare a cambiare i valori e immettere un nome nella quarta casella di testo. Chiudere l'applicazione ed eseguirla nuovamente. Nelle caselle di testo verranno visualizzati i nuovi valori.
Persistenza dell'oggetto tramite un formato SOAP
Nell'esempio sopra riportato è stato spiegato come garantire la persistenza di un oggetto in un file di testo utilizzando un formato binario. Tale formato è appropriato per la maggior parte delle applicazioni Windows. Nel caso di applicazioni Web o di servizi Web è possibile garantire la persistenza dell'oggetto in un file XML utilizzando un formato SOAP, per agevolare la condivisione dell'oggetto.
Per poter garantire la persistenza dell'oggetto in un formato SOAP, è necessario dapprima fare riferimento alla classe SoapFormatter. La classe SoapFormatter si trova nel relativo spazio dei nomi, ovvero System.Runtime.Serialization.Formatters.Soap.
Per salvare in modo permanente l'oggetto utilizzando un formato SOAP
In Esplora soluzioni selezionare il progetto LoanApp.
Scegliere Aggiungi riferimento dal menu Progetto.
Nella finestra di dialogo Aggiungi riferimento fare clic sulla scheda .NET e selezionare il componente System.Runtime.Serialization.Formatters.Soap.
Scegliere OK per chiudere la finestra di dialogo.
Nell'editor di codice aggiungere l'istruzione seguente all'inizio del modulo Form1:
Imports System.Runtime.Serialization.Formatters.Soap
using System.Runtime.Serialization.Formatters.Soap;
Modificare il nome file da SavedLoan.bin in SavedLoan.xml.
Nella routine dell'evento Form1_Load modificare la dichiarazione della variabile deserializer in:
Dim deserializer As New SoapFormatter
SoapFormatter deserializer = new SoapFormatter();
Nella routine dell'evento Form1_FormClosing modificare la dichiarazione della variabile serializer in:
Dim serializer As New SoapFormatter
SoapFormatter serializer = new SoapFormatter();
A questo punto è possibile compilare e testare l'applicazione. Quando si esegue per la prima volta l'applicazione, viene creato il file SavedLoan.xml. Per visualizzare il file, scegliere Mostra tutti i file in Esplora soluzioni. Il file risiederà nel nodo Bin del progetto Applicazione Windows.
Nota
Se è già stata attivata la modalità Mostra tutti i file, per visualizzare il file sarà necessario aggiornare la visualizzazione scegliendo Aggiorna dal menu Visualizza.
I tre membri di LoanClass sono visualizzati in formato XML. Cambiare il valore di InterestRate nel file XML, quindi salvare il file ed eseguire nuovamente l'applicazione. Il nuovo valore del tasso d'interesse verrà visualizzato nella seconda casella di testo.