SAGA 2: La sérialisation XML
Par amethyste le Aoû 10, 2008 | Dans focus | Réagir »
On va aborder un premier écueil: j'ai fais une sérialisation, mais entre temps le schéma a changé.
Je crois que l'on peut distinguer trois cas:
1. Le besoin en sérialisation est interne à votre application
2. Le fichier XML peut en effet contenir des informations parasites aléatoires qui ne vous intéressent pas
3. Vous écrivez un environnement distribué à des clients qui fournit une fonctionnalité de sérialisation. Que va-t-il se passer du côté de vos clients si vous changez le schéma?
Le premier cas est très simple. Corrigez l'application puis redéployez! Les cas suivants sont plus intéressants.
Sachez que la présence d'une section supplémentaire dans le fichier Xml ou bien son absence ne lèvent pas d'exceptions.
C'est une bonne nouvelle pour votre application qui continuera à fonctionner. Mais on peut souhaiter être alerté lorsque cela se produit.
Une nouveauté très attendue (en tout cas par moi-même) est la présence de trois nouveaux événements associés à la classe XmlSerializer:
1. UnknownAttribute
2. UnknownElement
3. UnknownNode
Ces événements n'appellent pas à grands commentaires, ils fournissent un jeu d'informations vraiment complet sur la cause du problème. On peut toutefois se demander la différence entre les deux derniers. Le nœud inconnu se réfère aux types référencés dans un schéma. L'utilisation d'un schéma est un cas que nous n'avons pas encore abordé. On le fera dans un futur article bien sûr.
Notez pour finir que l'une des surcharges de Deserialize() attend une structure XmlDeserializationEvents qui est un conteneur de délégués vers des gestionnaires d'événements correspondant aux trois événements précités.
Une dernière remarque.
Vous avez pu constater que la sérialisation ajoute par défaut des attributs d'espace de noms tels ceux-ci:
<Pays xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd ="http://www.w3.org/2001/XMLSchema" >
Si vous travaillez sans schéma particulier, vous souhaitez peut être vous débarrasser de ces attributs. C'est possible en complétant le code ainsi:
XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add(string.Empty, string.Empty);
Vous ajoutez ensuite ns parmi les arguments possible de la method Serialize() et on obtient:
<?xml version="1.0" encoding="utf-8"?> <Pays> <capitale>Paris</capitale> <nom>France</nom> </Pays>
La semaine prochaine nous nous attaqueront aux différentes subtilités qu'il y a à sérialiser les collections.
Bibliographie
[1] documentation de XmlSerializer
http://msdn.microsoft.com/fr-fr/library/system.xml.serialization.xmlserializer(VS.80).aspx
Notes d'ailleurs
La réponse à la question était l'astrophysicien indien Subrahmanyan Chandrasekhar.
Il fut au cœur de 'invention de l'astrophysique, odyssée racontée avec bonheur dans un livre récent "Sous l'empire des étoiles" d'où la citation a été extraite.
Il obtint le prix Nobel de physique en 1983, soit 53 ans après celui de son oncle découvreur de l'effet Raman.
Je me suis toujours demandé si le dr Chandra, père de HAL dans l'Odyssée de l'espace n'était pas un hommage rendu par Clarke à cet astrophysicien.
Aucun commentaire pour le moment
Laisser un commentaire
| « SAGA 3: Sérialisation XML | SAGA 1: la sérialisation XML (I) » |