Serializzazione - Listato3
a cura di Enrico Barillari (requisiti: conoscenza minima di .Net e C#)

  using System;
  using System.IO;
  using System.Xml;
  using System.Xml.Serialization;
  using System.Text;
  using System.Collections;

  namespace ebSerialization
  {
    /// <summary>
    /// Summary description for XmlSerializer.
    /// </summary>
    public class ebXmlSerializer
    {
      ///<summary> Variabile member: nome completo del file</summary>
      private string filePath = Directory.GetCurrentDirectory() + @"\PersonaXml.xml";
      ///<summary>
      ///Metodo: Costruttore predefinito
      ///</summary>
      public ebXmlSerializer()
      {
      }

      ///<summary>
      ///Metodo: Serializza un oggetto in formato XML
      ///</summary>
      ///<param name="persona">Istanza diPersona da serializzare</param>
      public void Serialize(Persona persona)
      {
        XmlTextWriter writer = null;
        try
        {
          // Creo un flusso per l'operazione di scrittura dei dati su file
          writer = new XmlTextWriter(filePath, Encoding.UTF8);
          // write a readable file
          writer.Formatting = Formatting.Indented;
          writer.Indentation = 4;
          // Occorre un'istanza della classe XmlSerializer
          XmlSerializer serializer = new XmlSerializer(typeof(Persona));
          // e questo é tutto ciņ che serve per persistere i dati
          serializer.Serialize(writer, persona);
        }
        catch(Exception ex)
        {
          throw new ApplicationException("ebXmlSerializer.Serialize: " + ex.Message);
        }
        finally
        {
          // Chiudere sempre i flussi non appena possibile
          writer.Close();
        }
      }

      ///<summary>
      ///Metodo: Deserializza una istanza di Persona da un file in formato XML
      ///</summary>
      public object Deserialize()
      {
        XmlTextReader reader = null;
        try
        {
          // Creo un flusso per l'operazione di lettura dei dati dal file
          reader = new XmlTextReader(filePath);
          // Occorre un'istanza della classe XmlSerializer
          XmlSerializer serializer = new XmlSerializer(typeof(Persona));
          // Collego l'istanza XmlSerializer al gestore dell'evento
          serializer.UnknownElement +=new XmlElementEventHandler(serializer_UnknownElement);
          // e questo é tutto ciņ che serve per leggere i dati dal formato XML
          return serializer.Deserialize(reader);
        }
        catch(FileNotFoundException)
        {
          throw new ApplicationException("File inesistente");
        }
        finally
        {
          reader.Close();
        }
      }

      ///<summary>
      ///Metodo: Gestore dell'evento UnknownElement
      ///</summary>
      private void serializer_UnknownElement(object sender, XmlElementEventArgs e)
      {
        Console.WriteLine("Unknown Element");
        Console.WriteLine("\t" + e.Element.Name + " " + e.Element.InnerXml);
        Console.WriteLine("\t LineNumber: " + e.LineNumber);
        Console.WriteLine("\t LinePosition: " + e.LinePosition);
        Persona x  = (Persona) e.ObjectBeingDeserialized;
        Console.WriteLine (x.Nome + " " + x.Cognome);
        Console.WriteLine (sender.ToString());
      }

      ///<summary>
      ///Metodo: Serializza un array in formato XML
      ///</summary>
      ///<param name="persona">Istanza di Persona da serializzare</param>
      public void SerializeArray(Persona[] persona)
      {
        XmlTextWriter writer = null;
        try
        {
          // Creo un flusso per l'operazione di scrittura dei dati su file
          writer = new XmlTextWriter(filePath, Encoding.UTF8);
          // write a readable file
          writer.Formatting = Formatting.Indented;
          writer.Indentation = 4;
          // Occorre un'istanza della classe XmlSerializer
          XmlSerializer serializer = new XmlSerializer(typeof(Persona[]));
          // e questo é tutto ciņ che serve per persistere i dati
          serializer.Serialize(writer, persona);
        }
        catch(Exception ex)
        {
          throw new ApplicationException("ebXmlSerializer.SerializeArray: " + ex.Message);
        }
        finally
        {
          // Chiudere sempre i flussi non appena possibile
          writer.Close();
        }
      }
      ///<summary>
      ///Metodo: Deserializza una istanza di Persona da un file in formato XML
      ///</summary>
      public Persona[] DeserializeArray()
      {
        XmlTextReader reader = null;
        try
        {
          // Creo un flusso per l'operazione di lettura dei dati dal file
          reader = new XmlTextReader(filePath);
          // Occorre un'istanza della classe XmlSerializer
          XmlSerializer serializer = new XmlSerializer(typeof(Persona[]));
          // Collego l'istanza XmlSerializer al gestore dell'evento
          serializer.UnknownElement +=new XmlElementEventHandler(serializer_UnknownElement);
          // e questo č tutto ciņ che serve per leggere i dati dal formato XML
          return (Persona[])serializer.Deserialize(reader);
        }
        catch(FileNotFoundException)
        {
          throw new ApplicationException("File inesistente");
        }
        finally
        {
          reader.Close();
        }
      }

      ///<summary>
      ///Metodo: Serializza un array in formato XML
      ///</summary>
      ///<param name="persona">Istanza di Persona da serializzare</param>
      public void SerializeArrayList(ArrayList persona)
      {
        XmlTextWriter writer = null;
        try
        {
          // Creo un flusso per l'operazione di scrittura dei dati su file
          writer = new XmlTextWriter(filePath, Encoding.UTF8);
          // write a readable file
          writer.Formatting = Formatting.Indented;
          writer.Indentation = 4;
          // Occorre un'istanza della classe XmlSerializer
          XmlSerializer serializer = new XmlSerializer(typeof(ArrayList),new Type[]{typeof(Persona)});  
          // e questo é tutto ciņ che serve per persistere i dati
          serializer.Serialize(writer, persona);
        }
        catch(Exception ex)
        {
          throw new ApplicationException("ebXmlSerializer.SerializeArray: " + ex.Message);
        }
        finally
        {
          // Chiudere sempre i flussi non appena possibile
          writer.Close();
        }
      }

      ///<summary>
      ///Metodo: Deserializza una istanza di Persona da un file in formato XML
      ///</summary>
      public ArrayList DeserializeArrayList()
      {
        XmlTextReader reader = null;
        try
        {
          // Creo un flusso per l'operazione di lettura dei dati dal file
          reader = new XmlTextReader(filePath);
          // Occorre un'istanza della classe XmlSerializer
          XmlSerializer serializer = new XmlSerializer(typeof(ArrayList),new Type[]{typeof(Persona)});  
          // Collego l'istanza XmlSerializer al gestore dell'evento
          serializer.UnknownElement +=new XmlElementEventHandler(serializer_UnknownElement);
          // e questo é tutto ciņ che serve per leggere i dati dal formato XML
          return (ArrayList)serializer.Deserialize(reader);
        }
        catch(FileNotFoundException)
        {
          throw new ApplicationException("File inesistente");
        }
        finally
        {
          reader.Close();
        }
      }
    }
  }