Serialisation XML et Dictionary Typé
Dans un de mes projets j'ai eut besoin de typé une collection de type Dictionary (jusque la pas de problème me direz vous), mais surtout cette classe devait être Serialisable pour passer par un Web Service ou un Remoting. Et la les choses se corsent, en effet mon premier réflexe consiste à mettre l'attribut [Serializable] sur ma classe. Mais voila, le framework me renvoie une erreur m'expliquant qu'un Dictionary ne peut être sérialisé. Je me dis donc que si les automatismes du framework ne sont pas applicables, je vais implémenter la fonctionnalité à l'ancienne en implémentant l'interface "ISerializable". Chose dite, chose faite :
public class FieldInfoCollection : DictionaryBase, ISerializable
{
private SerializationInfo m_serializationInfo;
protected FieldInfoCollection(SerializationInfo info, StreamingContext context)
{
m_serializationInfo = info;
}
[SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
if (info == null)
{
throw new ArgumentNullException("info");
}
}
// Le reste de mon implémentation (rien à voir avec la sérialisation)
}
Et la après les premiers tests de sérialisation qui sont concluant, je me rends compte que si la sérialisation binaire fonctionne, ce n'est pas le cas de la version XML (J'ai donc un remoting ok et mon web service toujours aussi peut concilient.
Quelques minutes plus tard et une recherche sur google plus loin, j'apprends qu'une interface au doux nom de "IXmlSerializable" pourrait m'aider dans ma quête. Un rapide coup d'œil au MSDN m'apprends qu'on est pas sensé s'en servir dans notre code (?????), mais de toute façon je suis plus à une entorse prés. Alors voyons le code qui en découle :
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
public void ReadXml(System.Xml.XmlReader reader)
{
reader.Read(); // move past container
while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
{
FieldInfo value = (FieldInfo)new XmlSerializer(typeof(FieldInfo)).Deserialize(reader);
reader.MoveToContent();
Add(value);
}
}
public void WriteXml(System.Xml.XmlWriter writer)
{
foreach (object val in Values)
{
new XmlSerializer(typeof(FieldInfo)).Serialize(writer, val);
}
}
Et la, ohhhh miracle, mon dico se sérialise enfin en XML comme en binaire. Evidement, FieldInfo qui est l'objet connu par celui-ci est lui-même sérialisable.
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :