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 Oggetto My.Settings.

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 sicurezzaNota 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 sicurezzaNota 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

  1. Creare un nuovo progetto Libreria di classi cui assegnare il nome LoanClass.Per ulteriori informazioni, vedere Creazione di soluzioni e progetti.

  2. 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.

  3. 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

  1. Per aggiungere un progetto di applicazione Windows Forms alla soluzione, selezionare Aggiungi dal menu File, quindi scegliere Nuovo progetto.

  2. Nella finestra di dialogo Aggiungi nuovo progetto immettere LoanApp come nome del progetto, quindi scegliere OK per chiudere la finestra di dialogo.

  3. In Esplora soluzioni selezionare il progetto LoanApp.

  4. Scegliere Imposta come progetto di avvio dal menu Progetto.

  5. Scegliere Aggiungi riferimento dal menu Progetto.

  6. Nella finestra di dialogo Aggiungi riferimento fare clic sulla scheda Progetti e selezionare il progetto LoanClass.

  7. Scegliere OK per chiudere la finestra di dialogo.

  8. Nella finestra di progettazione aggiungere quattro controlli TextBox al form.

  9. 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;
    }
    
  10. 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

  1. Aggiungere una costante alla classe per il nome del file dei dati serializzati.

    Const FileName As String = "..\..\SavedLoan.bin"
    
    const string FileName = @"..\..\SavedLoan.bin";
    
  2. 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

  1. In Esplora soluzioni selezionare il progetto LoanApp.

  2. Scegliere Aggiungi riferimento dal menu Progetto.

  3. Nella finestra di dialogo Aggiungi riferimento fare clic sulla scheda .NET e selezionare il componente System.Runtime.Serialization.Formatters.Soap.

  4. Scegliere OK per chiudere la finestra di dialogo.

  5. 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;
    
  6. Modificare il nome file da SavedLoan.bin in SavedLoan.xml.

  7. Nella routine dell'evento Form1_Load modificare la dichiarazione della variabile deserializer in:

    Dim deserializer As New SoapFormatter
    
    SoapFormatter deserializer = new SoapFormatter();
    
  8. 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.

Vedere anche

Concetti

Guida per programmatori C#

Altre risorse

Serializzazione (C# e Visual Basic)

Guida per programmatori Visual Basic