Csharp, dotnet...

XMLSerializer et Interfaces : contourner l'infaisable

Quelques fois, on a besoin de sauvegarder en fichiers XML des classes qui ne sont connues que par leurs interfaces. L'utilisation direct de la classe XMSserializer n'est pas possible, car cette dernière n'accepte pas les interfaces comme type à sérialiser (normal, on ne peut sérialiser que des types que l'on connait, une interface ne connait pas ses types internes).
 
C'est, encore, plus compliqué lorsqu'on veut sérialiser une interface qui est, elle-même, une collection d'une autre interface.
 
L'objectif (propre?) sera donc de se rapprocher au plus près des implémentations afin d'avoir des objets sérialisables. Ce principe casse un peu notre utilisation des interfaces...
 
 
Pour commencer :
 
IPortes est une interface : collection de IPorte
ImplCC.Portes est son implementation
 
IPorte est une interface : classe représentant une porte
ImplCC.Porte est son implementation
 
Nous allons avoir besoin d'une classe qui sera utilisée pour contenir les données de Portes qui seront sérialises.
PortesSerialisable
 
 
 
 
/*** la classe qui reprend les données de l'interface ***/
 
public class PortesSerializable
{
// l'element en xml s'appelera Porte
      [System.Xml.Serialization.XmlElement("Porte")]
// champ de la classe : un tableau de l'implementation de Porte
//(donc serialisable)
      public ImplCC.Porte[] _portes;
      public PortesSerializable(){} // Pour la serialisation
// constructeur qui va récupérer un tableau d'implementation de Porte
      public PortesSerializable(ImplCC.Porte[] p)
      {
            _portes = p;
      }
}
 
 
/** la classe qui ecrit notre collection de porte en xml **/
 
public static void Write(IPortes portes)
{
 // Creer une instance de la classe XmlSerializer
 // en speicifiant le type de l'objet (pas l'interface)
      XmlSerializer serializer = new XmlSerializer(typeof(PortesSerializable));
 
    // transferer la collection de porte dans un tableau pour sérialiser
 
      ImplCC.Porte[] ps =
                  new ImplCC.Porte[portes.Count];
 
    // ici on transtype l'interface en son implementation...:-(
      for (int i = 0; i < portes.Count; i++)
                  ps[i]=(ImplCC.Porte)portes[i];
 
      PortesSerializable tmp_portes = new PortesSerializable(ps);
 
      // Ouvrir un streamwriter
      TextWriter writer = new StreamWriter("porte.xml");
 
      // Serializer les portes et fermer le stream
      serializer.Serialize(writer, tmp_portes);
      writer.Close();
 
      return;
}
 
 

11:08 - 31/10/2007 - poster commentaire

Page Précédente Page Suivante
Description
Quelques notes sur csharp et dotnet

«  10 2008  »
LunMarMerJeuVenSamDim
 12345
6789101112
13141516171819
20212223242526
2728293031 

Accueil
Archives
Amis

Articles Recents
- System.Diagnostics simple ou pour les nuls, exemple
- Faire des mutex en CSharp
- progressbar, statusbar, invoke, invokerequired
- dot.net csharp profiler profile
- Log4net : traces applicatives dans dotnet : mise en place rapide et sale

Amis
- ben
- Christelle
- bartheju
- REBRAB
- BizigDu