Enregistrer un objet


Apprenez à enregistrer vos objets en C# avec la sérialisation. Vous allez pouvoir sauvegarder des instances d'une classe dans un fichier au format binaire (.bin), et rouvrir ce fichier depuis votre application C#.

Préparation de la classe à sérialiser

Dans la classe à sérialiser (à enregistrer), nous allons ajouter l’attribut System.Serializable pour dire au C# que cette classe va être sérialisé.
Pour ce tutoriel, nous allons sérialiser ma classe Client.

[System.Serializable]
public class Client { ... }

Afin d'éviter des problèmes de sérialisation, nous allons ajouter un constructeur sans paramètres.

[System.Serializable]
public class Client
{
    public Client() { ... }
}

Enregistrement et lecture

Nous allons créer deux méthodes, une pour sauvegarder notre objet sous forme de fichier sérialiser (en .bin), et une autre pour lire ce fichier et récupérer les informations. Pour ce tuto, je décide de créer ces méthodes dans une nouvelle classe qui sera public et static, mais si vous voulez faire autrement, libre à vous.
Cette classe s'appellera ClientSerialization.
Dans tous les cas, nous avons besoin de 3 namespaces. Les voici :

  • System.IO
  • System.IO.Compression
  • System.Runtime.Serialization.Formatters.Binary
using System;
using System.IO;
using System.IO.Compression;
using System.Runtime.Serialization.Formatters.Binary;
public static class ClientSerialization { ... }

Avant de créer la méthode d'enregistrement, il faut déterminer le type de l'objet à sauvegarder, dans ce tuto, ce sera une liste de clients.
Donc l'objet à sérialiser sera de type List<Client> dans ce tutoriel.

Voici la signature de la méthode pour sérialiser un objet :

public static void Save(List<Client> clientsList, string filePath){ ... }

Cette méthode à deux paramètres :

  • clientsList : c'est l'objet à sauvegarder.
  • filePath : contient le chemin du fichier à créer (répertoire + nom du fichier).

Voici le code de cette méthode :

public static void Save(List<Client> clientsList, string filePath)
{
    //Création et ouverture du fichier
    FileStream fs = File.Create(filePath);
    //Permet de sérialiser un objet
    BinaryFormatter bf = new BinaryFormatter();
    //Sérialisation de l'objet clientList dans le fichier créé
    bf.Serialize(fs, clientsList);
    //Fermeture du fichier
    fs.Close(); 
}

Dans cette étape, nous allons créer la méthode pour lire un fichier sérialisé. Cette méthode va beaucoup ressembler à la méthode pour l'enregistrement vue précédemment.

Voici la signature de la méthode :

public static List<Client> Open(string filePath){ ... }

La méthode prend en paramètre le chemin du fichier à ouvrir et retourne l'objet attendu, ici une liste de clients.

Voici le code de cette méthode :

public static List<Client> Open(string filePath)
{
    //Instanciation d'une nouvelle liste de clients, vide pour le moment.
    List<Client> clients = new List<Client>();

    //Si le fichier existe alors...
    if (File.Exists(filePath))
    {
        //Déclaration d'une variable FileStream
        FileStream fs = null;

        //Le bloc Try...Catch permet de gérer les erreurs si l'ouverture se passe mal
        try
        {
            //Ouverture du fichier
            fs = File.OpenRead(filePath);
            //Permet de déserialiser un fichier
            BinaryFormatter bf = new BinaryFormatter();
            //Déserialisation : On récupère notre objet
            clients = (List<Client>)bf.Deserialize(fs);
        }
        catch (Exception e)
        {
            //Affichage d'un message en cas d'erreur
            throw e;
        }
        finally
        {
            //Qu'il y est une erreur ou non, on ferme le fichier
            //s'il a été ouvert
            if(fs != null)
            {
                fs.Close();
            }
        }
    }

    //On retourne notre liste
    return clients;
}

Maintenant, vous pouvez sauvegarder des objets dans votre programme C#.
Voici un exemple d'utilisation de ces méthodes :

void Main
{
    string filePath = @"C:\\MonDossier\SousDossier\MesClients.bin";

    //Sauvegarde
    List<Client> myClients = new List<Clients>()
    {
        new Client("Kévin"),
        new Client("Jean"),
        new Client("Adam")
    };
    ClientSerialization.Save(myClients, filePath);

    //Lecture
    List<Client> myClients2 = ClientSerialization.Open(filePath);
}

Classe Client

[System.Serializable]
public class Client
{
    public Client() { ... }
}

Classe ClientSerialization

using System;
using System.IO;
using System.IO.Compression;
using System.Runtime.Serialization.Formatters.Binary;
public static class ClientSerialization
{
    public static void Save(List<Client> clientsList, string filePath)
    {
        //Création et ouverture du fichier
        FileStream fs = File.Create(filePath);
        //Permet de sérialiser un objet
        BinaryFormatter bf = new BinaryFormatter();
        //Sérialisation de l'objet clientList dans le fichier créé
        bf.Serialize(fs, clientsList);
        //Fermeture du fichier
        fs.Close(); 
    }
    
    public static List<Client> Open(string filePath)
    {
        //Instanciation d'une nouvelle liste de client, vide pour le momant.
        List<Client> clients = new List<Client>();

        //Si le fichier existe alors...
        if (File.Exists(filePath))
        {
            //Déclaration d'une variable FileStream
            FileStream fs = null;

            //Le bloc Try...Catch permet de gérer les erreurs si l'ouverture se passe mal
            try
            {
                //Ouverture du fichier
                fs = File.OpenRead(filePath);
                //Permet de déserialiser un fichier
                BinaryFormatter bf = new BinaryFormatter();
                //Déserialisation : On récupère notre objet
                clients = (List<Client>)bf.Deserialize(fs);
            }
            catch (Exception e)
            {
                //Affichage d'un message en cas d'erreur
                throw e;
            }
            finally
            {
                //Qu'il y est un erreur ou non, on ferme le fichier
                //s'il a été ouvert
                if(fs != null)
                {
                    fs.Close();
                }
            }
        }

        //On retourne notre liste
        return clients;
    }
}