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