Dopo aver reso la classe serializzabile, ora proviamo a serializzare tutto

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");
    }
}


Osservazione aggiuntiva

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.