Sérialisation
Introduction
La sérialisation est le nom du processus qui permet de convertir un objet en un flux. Il est alors possible de l’enregistrer dans un fichier ou de le transmettre à une autre application. La récupération de ce flux et sa transformation en objet sont appelées la désérialisation.
Le Framework .NET met à disposition deux techniques :
-
La sérialisation binaire permet de créer une copie exacte de l’objet sérialisé. Toutes les propriétés publiques, privées, sa classe ou encore son assemblage sont transformés en un flux de données.
-
La sérialisation XML crée une représentation des propriétés et des champs publics uniquement. L’avantage est que cela permet une communication plus aisée entre des applications hétérogènes. La sérialisation SOAP qui est une variante est largement utilisée notamment pour les services web.
La sérialisation binaire
La meilleure raison d’utiliser la sérialisation binaire est de rendre persistant l’état d’un objet afin de pouvoir le recréer à l’identique ultérieurement. Cet objet peut alors être stocké dans un fichier ou envoyé en tant que flux à travers le réseau. Un autre avantage est que la sérialisation binaire conserve l’état des membres publics et privés de l’objet.
A contrario, il n’est pas aisé d’utiliser les flux générés dans ou depuis une application tierce.
1. Les bases
Le prérequis pour rendre une classe sérialisable est de la marquer avec l’attribut Serializable. Tenter de sérialiser un objet qui ne serait pas marqué de cet attribut entraînerait la levée d’une exception de type SerializationException :
[Serializable]
public class ReplacedField
{
public string Pattern;
public string Field;
public bool HasChanged;
}
L’exemple de code ci-dessous montre la méthode permettant à un objet de cette classe d’être sérialisé dans un fichier :
// Instanciation et initialisation de l'objet
ReplacedField O = new ReplacedField();
O.Field = "myField";
O.Pattern = "myPattern";
O.HasChanged = true;
// Création du formateur binaire
IFormatter formatter = new BinaryFormatter();
// Création du flux
Stream stream = new FileStream(@"C:\ReplacedField.bin",
FileMode.Create);
// Sérialisation de l'objet dans le flux
formatter.Serialize(stream, O);
stream.Close();
stream.Dispose();
La sérialisation utilise un formateur binaire du type BinaryFormatter de l’espace de noms System.Runtime.Serialization.Formatters. Binary. Pour effectuer la transformation, il suffit d’appeler la méthode Serialize de cet objet en passant en paramètres le flux dans lequel écrire les données et l’objet à sérialiser.
La désérialisation suit le même schéma et utilise également un formateur binaire pour lequel il faut appeler...
La sérialisation XML
Le processus de sérialisation XML ne s’occupe que des champs publics, sans information sur les types, les champs privés ou les propriétés en lecture seule. Le principal avantage de la sérialisation XML est sa flexibilité au niveau du flux créé. Il permet de transporter facilement des données d’une application à une autre.
1. Les bases
Les processus de sérialisation et désérialisation XML suivent les mêmes principes que la sérialisation binaire à l’exception près que la classe n’a pas besoin d’être marquée par l’attribut Serializable :
public class ReplacedField
{
public string Pattern;
public string Field;
public bool HasChanged;
}
La classe XmlSerializer de l’espace de noms System.Xml.Serialization est utilisée pour effectuer les transformations :
// Instanciation et initialisation de l'objet
ReplacedField O = new ReplacedField();
O.Field = "myField";
O.Pattern = "myPattern";
O.HasChanged = true;
// Création du sérialiseur XML
XmlSerializer serializer = new
XmlSerializer(typeof(ReplacedField));
// Création du flux
Stream stream = new FileStream(@"C:\ReplacedField.xml",
FileMode.Create);
// Sérialisation de l'objet dans le flux
serializer.Serialize(stream, O);
stream.Close();
L’objet XmlSerializer prend en paramètre le type de l’objet à sérialiser. L’appel de la méthode Serialize de l’objet, en passant en paramètres le flux dans lequel écrire les données et l’objet à sérialiser, effectue la transformation.
Le résultat de la sérialisation précédente est le suivant :
<?xml version="1.0"?>
<ReplacedField xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Pattern>myPattern</Pattern>
<Field>myField</Field>
<HasChanged>true</HasChanged>
</ReplacedField>
L’élément...