« Programmation C sharp/La sérialisation » : différence entre les versions

Contenu supprimé Contenu ajouté
m Formatage, ajout de code
Ligne 6 :
 
== Attributs ==
L'[[Programmation C sharp/Attributs|attribut]] <ttcode>System.SerializableAttribute</ttcode> marque les classes dont les instances peuvent être sérialisées. Si l'attribut est absent pour une classe, la sérialisation de ses instances provoquera une exception.
 
Exemple :
Ligne 19 :
</source>
 
L'[[Programmation C sharp/Attributs|attribut]] <ttcode>System.NonSerializedAttribute</ttcode> marque les champs qu'il ne faut pas enregistrer. C'est le cas des champs dont on peut retrouver la valeur par calcul, par exemple.
 
Exemple :
Ligne 35 :
 
Quand la classe évolue, de nouveaux champs sont ajoutés à la classe, d'autres sont retirés.
L'[[Programmation C sharp/Attributs|attribut]] <ttcode>System.Runtime.Serialization.OptionalFieldAttribute</ttcode> marque les champs optionnels lors de la désérialisation (lecture de l'objet). Il est donc possible de marquer les nouveaux champs comme optionnels, et garder les anciens champs (marqués optionnels également) pour garder la compatibilité avec les anciens fichiers.
 
Exemple :
Ligne 52 :
}
</source>
Dans cet exemple, la classe Facture permettra de lire des fichiers d'objets <ttcode>Facture</ttcode> contenant le champ <ttcode>AdresseLivraison</ttcode> ou non.
 
== La sérialisation ==
Le format de sérialisation dépend de la classe utilisée pour sérialiser les objets.
 
=== La classe <ttcode>System.Runtime.Serialization.Formatter</ttcode> ===
Cette [[Programmation C sharp/Classe abstraite|classe abstraite]] définit les méthodes suivantes :
 
Ligne 63 :
[[Programmation C sharp/Entrées-sorties#La classe Stream|System.IO.Stream]] serializationStream,
object graph);
:Cette méthode enregistre l'objet <ttcode>graph</ttcode> dans le flux d'[[Programmation C sharp/Entrées-sorties|entrée-sortie]] spécifié.
 
object Deserialize(
Ligne 73 :
* La classe System.Runtime.Serialization.Formatters.Soap.SoapFormatter permet de sérialiser au format [[w:Simple Object Access Protocol|SOAP]].
 
Une classe dérivée de <ttcode>System.Runtime.Serialization.Formatter</ttcode> sérialise les attributs et les évènements d'un objet, quel que soit l'accès associé (public, protégé, privé, ou par défaut).
 
=== Format XML ===
La classe <ttcode>System.Xml.Serialization.XmlSerializer</ttcode> permet de sérialiser au format XML. Elle ne dérive pas de la classe <ttcode>System.Runtime.Serialization.Formatter</ttcode>, et possède les méthodes suivantes :
 
void Serialize(
Ligne 87 :
System.Xml.XmlWriter xmlWriter,
object o);
:Ces méthodes enregistrent l'objet <ttcode>o</ttcode> dans le flux d'[[Programmation C sharp/Entrées-sorties|entrée-sortie]] spécifié.
 
object Deserialize(
Ligne 97 :
:Ces méthodes retournent l'objet lu depuis le flux d'[[Programmation C sharp/Entrées-sorties|entrée-sortie]] spécifié.
 
Pour le format XML, les attributs <ttcode>Serializable</ttcode> et <ttcode>NonSerialized</ttcode> sont ignorés :
* Toute classe est sérialisable en XML,
* L'attribut <ttcode>System.Xml.Serialization.XmlIgnoreAttribute</ttcode> marque les champs à ignorer lors de la sérialisation.
 
La classe <ttcode>System.Xml.Serialization.XmlSerializer</ttcode> sérialise les attributs et les propriétés en lecture/écriture publics d'un objet, si la valeur n'est pas nulle. Donc la sérialisation en XML ignore :
* les attributs et propriétés retournant une valeur nulle,
* les attributs et propriétés protégés ou privés,
Ligne 111 :
 
== Sérialisation personnalisée ==
Il est possible de personnaliser la manière de sérialiser un objet en implémentant l'interface <ttcode>System.Runtime.Serialization.ISerializable</ttcode>.
 
Cette interface n'a qu'une méthode, invoquée lors de la sérialisation :
Ligne 129 :
public ''T'' Get''Type''(string name) // GetByte, GetChar, GetInt16, GetDecimal, GetDateTime, ...
 
L'implémentation de la méthode <ttcode>GetObjectData</ttcode> fait appel à la méthode <ttcode>AddValue</ttcode> de l'objet <ttcode>info</ttcode> pour ajouter une valeur à sauvegarder. Le constructeur utilise la méthode <ttcode>GetValue</ttcode> ou les méthodes <ttcode>Get''Type''</ttcode> pour retrouver la valeur sauvegardée.
 
Exemple :