Espace perso
Ignorer les liens de navigationAccueil >> .Net >> Framework .Net >> La sérialisation en .Net
Ignorer les liens de navigation
Accueil de mon site Accueil
Vous trouverez ici des tutoriels en relation avec le Framework .Net .Net .Net
 SQL Server SQL Server
 IIS IIS
 Tests Tests
 Livres Livres

Sérialisation en .Net

Publié le vendredi 27 janvier 2006, dernière modification le lundi 28 janvier 2008

La sérialisation, qu'est-ce que c'est et à quoi ça sert ? Nous étudierons dans ce tutorial les 3 différentes méthodes de sérialisation que Microsoft a mis à notre disposition dans le Framework .NET et comment les utiliser. Pour terminer, je vous fournirais un petit récapitulatif sur les 3 méthodes.

Bonne lecture.

Introduction

Info Info
La sérialisation est le processus de conversion de l'état d'un objet en une forme enregistrable ou transportable. Le complément de la sérialisation est la désérialisation, qui convertit un flux en objet. Ensemble, ces processus facilitent le stockage et le transfert des données.

Cet extrait de la MSDN résume parfaitement le rôle de la sérialisation. Vous comprenez très vite les avantages que vous pouvez en tirer. Plus besoin d'écrire vous-même des pages de code énormes pour sauvegarder vos données dans des fichiers, la sérialisation le fait pour vous. La communication entre applications devient également un jeu d'enfant. Les Services Web sont, entre autres, fondés sur ce processus de sérialisation / désérialisation.

Afin de vous faciliter encore plus le travail, Microsoft a inclus dans le Framework .NET les outils pour la sérialisation sous 3 formes : XML, SOAP et binaire. Chacune de ces techniques de sérialisation présente ses avantages et ses inconvénients. Nous verrons les possibilités qu'apportent chacune d'entre elles.

Afin d'avoir une base pour la mise en pratique ce que nous allons voir, nous utiliserons un objet type. Vous pouvez télécharger les sources complètes à la fin de l'article.

Afin de simplifier le code au maximum et ne pas le surcharger afin de ne pas perdre sa clarté, j'ai volontairement omis tout ce qui concerne la gestion des erreurs (dans la mesure du possible). Etant donné que dans ce tutoriel:c:, nous travaillerons avec des fichiers, n'oubliez pas la gestion des exceptions relatives aux fichiers.

Warning Warning
Ce tutoriel a été écrit en se basant sur la version 2 du Framework .Net.
Nous ne nous attarderons pas non plus sur la gestion des exceptions. Pensez quand même que dans ces exemples nous travaillons avec des fichiers et que vous pourriez vous retrouver avec des exceptions de type FileNotFoundException ou du style.

1. Les attributs de la sérialisation

Pour effectuer une sérialisation d'un objet, il est nécessaire que lui et ses propriétés possèdent certains attributs.

1.1. SerializableAttribute

Cet attribut spécifie que l'objet est sérialisable. Si vous tentez de sérialiser un objet ne possédant pas cet attribut, une SerializationException sera levée.

Info Info
La sérialisation XML ne nécessite pas cet attribut.

1.2. NonSerializedAttribute

Il s'utilise devant un champ d'un objet pour spécifier qu'il ne doit pas être sérialisé. Etant donné que l'AttributeUsage du NonSerializedAttribute ne prévoit pas les méthodes, n'essayez pas de l'utiliser sur des propriétés et encore moins sur des méthodes.

2. Idée générale

Bien le fait que le Framework .NET fournisse 3 méthodes différentes pour sérialiser les objets, le principe de mise en ?uvre reste sensiblement le même.

Comme vous le constaterez dans les exemples de code ci-après, les différences sont minimes (espace de noms, types de sérialiseur).

Je vais donc expliquer ici le principe de fonctionnement général.

principe
Principe de la sérialisation

Le schéma peut vous paraître assez simpliste, mais la réalité l'est tout autant.

Pour sérialiser un objet, vous devez fournir au sérialiseur un flux (FileStream, MemoryStream, ?) et l'objet à sérialiser, bien entendu.

Bien sur, il existe des spécificités pour chacune des 3 méthodes, regardons-les de plus près.

Pour tous les exemples et les résultats, nous utiliserons cette classe comme objet à sérialiser :

  Copier le code Copier le code
 1 <Serializable()> _
 2 Public Class ObjSerialization
 3 
 4     Public Sub New()
 5 
 6     End Sub
 7 
 8     Private _Nom As String = "Exemple de sérialisation SOAP"
 9     Public Property Nom() As String
10         Get
11             Return _Nom
12         End Get
13         Set(ByVal value As String)
14             _Nom = value
15         End Set
16     End Property
17 
18     Public _Couleur As System.Drawing.Color = Drawing.Color.AliceBlue
19     Public Property Couleur() As System.Drawing.Color
20         Get
21             Return _Couleur
22         End Get
23         Set(ByVal value As System.Drawing.Color)
24             _Couleur = value
25         End Set
26     End Property
27 
28 End Class

Fermer

3. La sérialisation XML

Pour pouvoir utiliser la sérialisation XML, faites référence au namespace System.XML.Serialization contenu dans l'assembly System.XML.dll

La première chose à savoir sur le sérialiseur XML, c'est qu'il ne tient pas compte des champs et propriétés privés d'un type. De plus, les attributs SerializableAttribute et NonSerializedAttribute n'ont aucun effet sur le sérialiseur XML, donc n'importe quel champ ou propriété publiques de n'importe quelle classe sont sérialisables.

Pourquoi un tel comportement ? Le sérialiseur XML n'utilise pas les attributs standards de sérialisation (SerializableAttribute et NonSerializedAttribute). Pour ignorer un champs lors de la sérialisation, utilisez le XmlIgnoreAttribute.

3.1. Sérialisation

  Copier le code Copier le code
 1 Public Shared Function Serialize(ByVal objet As Object, ByVal fichier As String, _
 2           ByVal type As Type) As Boolean
 3 
 4     If objet Is Nothing Then Return False
 5 
 6     Dim stream As StreamWriter = New StreamWriter(fichier)
 7     Dim serializer As XmlSerializer = New XmlSerializer(type)
 8     serializer.Serialize(stream, objet)
 9     stream.Close()
10 
11     Return True
12 
13 End Function

Fermer
Exemple de flux obtenu par sérialisation XML Copier le code Copier le code
1 <?xml version="1.0" encoding="utf-8" ?> 
2 <ObjSerialization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
3 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
4     <_Couleur /> 
5     <Nom>Exemple de sérialisation SOAP</Nom> 
6     <Couleur /> 
7 </ObjSerialization>

Fermer

3.2. Déserialisation

  Copier le code Copier le code
 1 Public Shared Function Deserialize(ByVal fichier As String, _
 2         ByVal objtype As Type) As Object
 3 
 4     If Not File.Exists(fichier) Then Return Nothing
 5     
 6     Dim deserializer As XmlSerializer = New XmlSerializer(objtype)
 7     Dim stream As StreamReader = New StreamReader(fichier)
 8     Dim result As Object = Nothing
 9     result = deserializer.Deserialize(stream)
10     stream.Close()
11 
12     Return result
13 
14 End Function

Fermer

4. Sérialisation SOAP

La sérialisation SOAP est similaire à la sérialisation XML quant au format de sortie mais diffère en bien des points.

Info Info
SOAP est un dérivé de XML. En plus des noms des champs, il fournit d'autres informations complémentaires, mais nous n'allons pas nous attarder dessus, nous dépasserions le cadre de ce tutoriel.

Avant toutes choses, la classe que vous allez sérialiser doit porter l'attribut SerializableAttribute, sans quoi vous vous retrouverez avec une jolie exception de type SerializationException vous indiquant que l'objet XXX n'est pas marqué comme sérialisable.

Ensuite, il vous faut ajouter la référence à la libraire du .Net Framework System.Runtime.Serialization.Formatters.Soap et importer le namespace du même nom.

4.1. Sérialisation

  Copier le code Copier le code
 1 Public Shared Function Serialize(ByVal objet As Object, _
 2           ByVal fichier As String) As Boolean
 3 
 4     If objet Is Nothing Then Return False
 5 
 6     Dim stream As FileStream = New FileStream(fichier, FileMode.Create)
 7     Dim serializer As SoapFormatter = New SoapFormatter
 8     serializer.Serialize(stream, objet)
 9     stream.Close()
10 
11     Return True
12 
13 End Function

Fermer
Exemple de flux obtenu par sérialisation SOAP Copier le code Copier le code
 1 <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 2 xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
 3 xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
 4 xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
 5 xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" 
 6 SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
 7     <SOAP-ENV:Body>
 8         <a1:ObjSerialization id="ref-1" 
 9         xmlns:a1="http://schemas.microsoft.com/clr/nsassem/TestSerializationVB/TestSerializationVB%2C%20
10         Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
11             <_Nom id="ref-4">Exemple de sérialisation SOAP</_Nom>
12             <_Couleur>
13                 <name xsi:null="1"/>
14                 <value>0</value>
15                 <knownColor>28</knownColor>
16                 <state>1</state>
17             </_Couleur>
18         </a1:ObjSerialization>
19     </SOAP-ENV:Body>
20 </SOAP-ENV:Envelope>

Fermer

4.2. Désérialisation

  Copier le code Copier le code
 1 Public Shared Function Deserialize(ByVal fichier As String) As Object
 2 
 3     If Not File.Exists(fichier) Then Return Nothing
 4 
 5     Dim deserializer As SoapFormatter = New SoapFormatter
 6     Dim stream As FileStream = New FileStream(fichier, FileMode.Open)
 7     Dim result As Object = Nothing
 8     result = deserializer.Deserialize(stream)
 9     stream.Close()
10 
11     Return result
12 
13 End Function

Fermer

5. Sérialisation Binaire

La sérialisation binaire n'a rien à voir avec les deux types de sérialisation que nous venons de voir au niveau du format de sortie.

Pour pouvoir utiliser la sérialisation binaire, importez le namespace System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.

5.1. Sérialisation

  Copier le code Copier le code
 1 Public Shared Function Serialize(ByVal objet As Object, ByVal fichier As String) As Boolean
 2 
 3     If objet Is Nothing Then Return False
 4 
 5     Dim stream As FileStream = New FileStream(fichier, FileMode.Create)
 6     Dim serializer As Runtime.Serialization.Formatters.Binary.BinaryFormatter = _
 7         New Runtime.Serialization.Formatters.Binary.BinaryFormatter
 8     serializer.Serialize(stream, objet)
 9     stream.Close()
10 
11     Return True
12 
13 End Function

Fermer

5.2. Désérialisation

  Copier le code Copier le code
 1 Public Shared Function Deserialize(ByVal fichier As String) As Object
 2 
 3     If Not File.Exists(fichier) Then Return Nothing
 4     
 5     Dim deserializer As Runtime.Serialization.Formatters.Binary.BinaryFormatter = _
 6         New Runtime.Serialization.Formatters.Binary.BinaryFormatter
 7     Dim stream As FileStream = New FileStream(fichier, FileMode.Open)
 8     Dim result As Object = Nothing
 9     result = deserializer.Deserialize(stream)
10     stream.Close()
11 
12     Return result
13 
14 End Function

Fermer

6. Récapitulatif

Pour clarifier un peu les avantages et les inconvénients de ces différentes méthodes, voici un petit récapitulatif sous forme de tableau pour comparer les différentes possibilités proposées par les sérialiseurs du Framework.NET :

  XML SOAP Binaire
"Human Readable" Oui Oui Non
Communication avec Mono sous Linux Oui Oui Non
Sérialisation de types non standards Non Oui Oui
Sérialisation des éléments privés Non Oui Oui
Sérialisation des champs Non Oui Oui
Sérialisation des propriétés Oui Non Non
Utilisation faite dans la plate-forme .Net - Services Web Remoting


Pour tester un peu les performances de ces différentes méthodes, j'ai sérialisé et désérialisé dans la foulée notre objet ObjSerialization 50 000 fois.

La machine utilisée pour ces tests est un Dell Inspiron 8200 doté d'un Pentium IV à 1,7GHz et de 1Go de Ram sous Windows XP SP2 avec le Framework v2.0.50727.

Essai XML SOAP Binaire
Essai n°1 1:06.4 1:21.1 0:50.4
Essai n°2 1:03.7 1:21.8 0:49.5
Essai n°3 1:03.4 1:21.2 0:49.5
Moyenne 1:04.5 1:21.4 0:49.8


Comme vous pouvez le constater, malgré qu'elle soit complète la sérialisation binaire est celle qui offre les meilleures performances. La sérialisation XML et SOAP étant similaire, mais la première n'étant pas aussi précise que la seconde, les performances sont donc meilleures avec XML qu'avec SOAP mais au prix d'une perte d'information dans certains cas (ici par exemple).

Sachez que la sérialisation binaire est utilisée en remoting du fait de sa rapidité par rapport aux deux autres méthodes fournies par le Framework .Net.

La sérialisation SOAP, elle, est utilisée pour les Services Web puisque son format dérivé de XML (SOAP) permet l'interoperabilité entre les plate-formes (java, delphi, php, ...) et passe plus facilement au travers des firewalls.

Je pense que ce petit récapitulatif vous aidera à vous orienter vers la méthode de sérialisation la plus adaptée à vos besoins.

Conclusion

Avec la sérialisation, vous voyez qu'il est possible de sauvegarder et surtout de récupérer vos informations en quelques lignes en utilisant les outils mis à votre disposition par le Framework .NET. Si toutefois vous n'étiez pas satisfait, vous pouvez toujours repartir des sérialiseurs mis à votre disposition pour créer le votre sans trop de travail, mais cette application fera l'objet d'un prochain tutoriel.

Un grand merci à Jean-Marc Rabilloud pour ses explications complémentaires sur la sérialisation XML et à Xo et à Cécile Muno pour leurs remarques et corrections.

Téléchargements

Téléchargez les sources de cet article pour Visual Studio 2005 version VB.Net
Téléchargez cet article au format PDF version VB.Net

Copyright © 2010 - Olivier Delmotte
Ce site utilise des icône de la librairy Silk icon set 1.3

Valid XHTML 1.0 Transitional ASP.Net Valid CSS!