using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
// Etichettiamo la classe come serializzabile
[Serializable]
public class Persona
{
// Campo privato non serializzato
[NonSerializable]
int eta;
// Proprietà pubblica che consente la lettura dell'età
public int Eta { get { return eta; } }
// Proprietà serializzate
public string Cognome { get; set; }
public string Nome { get; set; }
// Costruttore
public Persona(string c, string n, int e)
{
Cognome = c;
Nome = n;
eta = e;
}
// Override opzionale di ToString per rappresentazione leggibile (da aggiungere eventualmente)
}
Nota: anche se il campo eta non è decorato con [NonSerialized], essendo un campo privato e non essendoci alcuna specifica restrizione, sarà comunque serializzato. Tuttavia, è buona prassi esplicitare l’intenzione se si desidera escluderlo.
public class Rubrica
{
public List<Persona> elenco;
// Costruttore che inizializza la lista
public Rubrica()
{
elenco = new List<Persona>();
}
// Metodo per aggiungere una persona alla rubrica
public void Add(Persona p)
{
elenco.Add(p);
}
// Override di ToString per visualizzare il contenuto della rubrica
public override string ToString()
{
string tmp = "";
foreach (Persona item in elenco)
tmp += item.ToString(); // Potrebbe risultare poco leggibile se Persona non overridea ToString()
return tmp;
}
}
public static class GestioneFile
{
// Metodo per serializzare una singola persona
public static void Scrivi(string path, Persona p)
{
try
{
BinaryFormatter bf = new BinaryFormatter();
FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write);
bf.Serialize(fs, p);
fs.Close();
}
catch (Exception e)
{
// Gestione dell’errore assente: buona prassi sarebbe almeno un log o Console.WriteLine
}
}
// Metodo per serializzare una lista di persone
public static void ScriviLista(string path, List<Persona> p)
{
try
{
BinaryFormatter bf = new BinaryFormatter();
FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write);
bf.Serialize(fs, p);
fs.Close();
}
catch (Exception e)
{
// Anche qui, gestione dell’eccezione da migliorare
}
}
public static List<Persona> Carica(string path){
List<Persona> p = new List<Persona>();
try{
if(File.Exist(path)){
BinaryFormatter bf = new BinaryFormatter();
FileStream fs = new FileStream(path,FileMode.Open,FileAccess.Read);
p = (List<Persona>) bf.deserialize(fs);
fs.close();
}
}catch{}
return p;
}
}
class Program
{
static void Main()
{
// Creazione di una singola persona
Persona p = new Persona("Rossi", "Mario", 56);
GestioneFile.Scrivi("file.bin", p);
// Creazione di una rubrica con più persone
Rubrica r = new Rubrica();
r.Add(new Persona("Rossi", "Mario", 56));
r.Add(new Persona("Bianchi", "Luca", 42));
r.Add(new Persona("Verdi", "Anna", 33));
// Serializzazione della lista di persone contenuta nella rubrica
GestioneFile.ScriviLista("file.bin", r.elenco);
List<Persona> p = GestioneFile.Carica("persona.bin");
}
}
Anche nei file binari, sebbene non siano leggibili come XML, è presente una struttura.
Questa struttura non è facilmente interpretabile visivamente, ma esiste: è solo meno evidente, meno "divisibile" e comprensibile rispetto ai formati testuali strutturati come l’XML.
Lettura
Aggiungere il solito assembly Istaxnaire un binari formattare bf =new Aprire il mio file binario attraverso il mio filestrea e deserializzare. Torna un oggetto che io devo cantare a quello che ser v E a me, ritorna un insieme di dati e io lo devo cantare e chiudo.