| Csharp, dotnet... |
XMLSerializer et Interfaces : contourner l'infaisableQuelques 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
|
Description Quelques notes sur csharp et dotnet
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 |
||||||||||||||||||||||||||||||||||||||||||||