avr
27
2010

Tutoriel sur la sérialisation en C# – Partie 1

Pré requis :

Visual studio c# (Express ou autres édition)

.net Framework

Développement :

Nous allons commencer par développer un simple carnet d’adresses, dans lequel on pourra ajouter des personnes, ainsi que sauvegarder et charger le carnet d’adresse par le biais de la sérialisation, une façon rapide et facile de travailler la translation entre les objets et les fichiers.

Commençons tout d’abord par créer le projet comme ce qui suis

Fichier / Nouveau / Projet

Création du projet

Création du projet

Nous allons rajouter plusieurs contrôles à notre fenêtre actuellement nommée Form1

Liste des composants sur la form

Contrôle Nom
Listview listViewCarnet
Button ButtonAjouter
Button ButtonCharger

Edition de la listview

Mettre la listview au format Détails, et cliquez sur Editer les colonnes.

On crée trois colonnes une pour le nom une pour le prénom et pour finir une pour le téléphone.

Voilà nous avons désormais une interface pour visionner nos enregistrements, continuons par ajouter une nouvelle form au projet que nous nommerons FormAdresse permettant d’alimenter notre carnet.

Pour faire ceci faire clic droit sur le projet / ajouter / Winform control

Une fois la form construite elle devrais ressembler à ceci

Dans les propriétés de la form spécifiez dans la catégorie Misc(Autres) le bouton accepter et annuler de la form.

Dans les propriétés du buttonAjouter dans le champ DialogResult mettez la propriétés a “OK”.

Méthode pour le bouton annuler (Double cliquez sur le bouton annuler pour l’auto généré)

private void buttonAnnuler_Click(object sender, EventArgs e)
{
Close();
}

Rajoutez le Close(); pour permettre de fermer la form, sans conserver les données entrées par l’utilisateur.

On fait exactement la même chose pour le bouton Ajouter

private void buttonAjouter_Click(object sender, EventArgs e)
{
Close();
}

Revenons sur la form principale (Form1) et double cliquez sur le bouton ajouter

private void buttonAjouter_Click(object sender, EventArgs e)
{
FormAdresse formAdresse = new FormAdresse();

if (formAdresse.ShowDialog() == DialogResult.OK)
{
// TODO : Traitement du retour
}
}

On rajoute le code suivant qui permettra d’ouvrir la nouvelle form de façon modal (obligation de fermer la form d’ajout d’adresse pour revenir à celle principale).

Créons maintenant une classe Adresse permettant de stocker les variables pour l’adresse d’une personne.

Clic droit sur le projet / Ajouter / Classe

Remplissez la comme ce qui suis

using System;

namespace TutoCarnet
{
public class Adresse
{
string nom;
string prenom;
string telephone;

public string Nom
{
get { return nom; }
set { nom = value; }
}

public string Prenom
{
get { return prenom; }
set { prenom = value; }
}

public string Telephone
{
get { return telephone; }
set { telephone = value; }
}

public Adresse()
{

}
}
}

Tips :

Lorsque vous créé une variable faite un CTRL + R + E dessus ce qui activera le refractoring et ajoutera automatiquement les Get et Set (Fonction non disponible sur Visual C# Express)

Nous allons créer notre classe Carnet comme ce qui suis

using System;

using System.Collections.Generic;

namespace TutoCarnet
{

public class Carnet
{

List<Adresse> listeAdresses;

public List<Adresse> ListeAdresses
{
get { return listeAdresses; }
set { listeAdresses = value; }
}

public Carnet()
{
listeAdresses = new List<Adresse>();
}
}
}

Nous allons créer notre carnet au sein de la première form (Form1)

public partial class Form1 : Form
{
Carnet carnetAdresses;

public Form1()
{
InitializeComponent();
carnetAdresses = new Carnet();
}

Puis dans le constructeur de la FormAdresse nous allons rajouter un paramètre pour ajouter une adresse

public partial class FormAdresse : Form
{

Adresse adresse;

public FormAdresse(Adresse uneAdresse)
{
InitializeComponent();
this.adresse = uneAdresse;
}

private void buttonAnnuler_Click(object sender, EventArgs e)
{
Close();
}

private void buttonAjouter_Click(object sender, EventArgs e)
{
adresse.Nom = textBoxNom.Text;
adresse.Prenom = textBoxPrenom.Text;
adresse.Telephone = textBoxTel.Text;
Close();
}

}

Voici le code après modification, n’oublions pas de passer le nouveau paramètre dans l’appel de la form

private void buttonAjouter_Click(object sender, EventArgs e)
{

Adresse nouvelleAdresse = new Adresse();
FormAdresse formAdresse = new FormAdresse(nouvelleAdresse);
if (formAdresse.ShowDialog() == DialogResult.OK)
{
carnetAdresses.ListeAdresses.Add(nouvelleAdresse);
RemplirListe();
}
}

Et une méthode RemplirListe permettant de mettre à jour la listview

private void RemplirListe()
{
listViewCarnet.Items.Clear();
foreach (Adresse adresse in carnetAdresses.ListeAdresses)
{
ListViewItem item = new ListViewItem();
item.Text = adresse.Nom;
item.SubItems.Add(adresse.Prenom);
item.SubItems.Add(adresse.Telephone);
listViewCarnet.Items.Add(item);
}
}

Ce qui nous donne les enregistrements dans la listview

La partie la plus important de notre tutorial arrive désormais \o/ la sérialisation.

On va modifier le classe Carnet et la classe Adresse pour permettre au serializer de faire son travail correctement.

using System.IO;

using System.Xml.Serialization;

On rajoute ces deux directives dans la classe Carnet

using System.Xml.Serialization;

Et cette directive dans la classe Adresse

Puis dans la classe carnet et adresse rajouté l’attribut [Serializable]

[Serializable]
public class Carnet
[Serializable]
public class Adresse

Attention pour qu’un objet soit sérialisable il faut absolument un constructeur sans paramètres.

On va rajouter deux méthodes dans la classe carnet permettant de charger et de sauvegarder celui-ci

public void Sauvegarder(string filename)
{
FileStream file = File.Open(filename, FileMode.OpenOrCreate);
XmlSerializer serializer = new XmlSerializer(typeof(Carnet));
serializer.Serialize(file, this);
file.Close();
}

On ouvre le fichier et on le stock dans un FileStream, puis on déclare l’xmlserializer en lui passant en paramètre l’objet que l’on veut sérialiser (typeof(Carnet)), ensuite execute la méthode serialize qui va stocker les données directement dans le fichier enfin on ferme le fichier (A ne surtout pas oublier).

public Carnet Charger(string filename)
{
FileStream file = File.Open(filename, FileMode.Open);
XmlSerializer serializer = new XmlSerializer(typeof(Carnet));
Carnet unCarnet = (Carnet)serializer.Deserialize(file);
file.Close();
return unCarnet;
}

Même chose que précédement sauf que l’on utilise la méthode Deserialize de l’objet serializer pour retourner notre nouveau carnet.

Revenons à notre form principale et rajoutez un bouton sauvegarder.

private void buttonSauvegarder_Click(object sender, EventArgs e)
{
SaveFileDialog boiteSauvegarde = new SaveFileDialog();
boiteSauvegarde.Filter = "Fichier xml(*.xml)|*.xml";
if (boiteSauvegarde.ShowDialog() == DialogResult.OK)
{
carnetAdresses.Sauvegarder(boiteSauvegarde.FileName);
}
}

On ouvre une boite de dialogue permettant de choisir l’emplacement de la sauvegarde, on filtre uniquement les fichiers XML et on appel la méthode sauvegarder avec le nom du fichier choisit.

private void buttonCharger_Click(object sender, EventArgs e)
{
OpenFileDialog boiteOuverture = new OpenFileDialog();
boiteOuverture.Filter = "Fichier xml(*.xml)|*.xml";
if (boiteOuverture.ShowDialog() == DialogResult.OK)
{
carnetAdresses = carnetAdresses.Charger(boiteOuverture.FileName);
RemplirListe();
}
}

On retrouve casiment le même code que pour la méthode de sauvegarde sauf que dans celle-ci on applique la méthode charger qui retournera un objet de type carnet que nous réapliquerons sur notre carnet courant et on exécutera la méthode remplir liste pour afficher nos informations.

C’est magique tout fonctionne on peut créer un carnet et l’afficher ainsi que le sauvegarder et le charger.

Le fichier xml contiendra les données suivantes

<?xml version="1.0"?>

<Carnet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<ListeAdresses>

<Adresse>

<Nom>titi</Nom>

<Prenom>toto</Prenom>

<Telephone>0606060606</Telephone>

</Adresse>

<Adresse>

<Nom>blabla</Nom>

<Prenom>jean</Prenom>

<Telephone>0505050505</Telephone>

</Adresse>

</ListeAdresses>

</Carnet>

Un bon moyen de sauvegarder et charger les données pour tout type de projet sans s’embêter.

Source du projet

TutoCarnet

  • Pingback: Tutorial sur la sérialisation en C# – Partie 2

  • Pingback: TUTORIEL .NET REMOTING

  • http://SiteWeb innocenceesstt

    merci pour ce tutoriel

  • http://SiteWeb Vice

    1 private void buttonAjouter_Click(object sender, EventArgs e)
    2 {
    3 FormAdresse formAdresse = new FormAdresse();
    4
    5 if (formAdresse.ShowDialog() == DialogResult.OK)
    6 {
    7 // TODO : Traitement du retour
    8 }
    9 }

    Visu Studio 2010 ne veut pas du “formAdresse.showDialog” (Une référence d’objet est requise pour la propriété, la méthode ou le champ non statique ‘System.Windows.Forms.Form.ShowDialog())

    Merci quand même.
    +

  • http://www.ace-art.fr/wordpress/ Pierre-Emmanuel Mercier

    A l’époque ou je l’ai fait je n’étais pas sous VS2010, mais sous 2008, tu devrais regarder du côté de la MSDN pour voir les changements apportés à cette méthode avec le .net 4.0

    Bonne journée