Une aide générique pour ajouter rapidement IXmlSerializable à n'importe quel dictionnaire (existant) sans utiliser l'héritage :
using System.Xml;
using System.Xml.Serialization;
using System.Collections.Generic;
namespace GameSpace {
public class XmlSerializerForDictionary {
public struct Pair<TKey,TValue> {
public TKey Key;
public TValue Value;
public Pair(KeyValuePair<TKey,TValue> pair) {
Key = pair.Key;
Value = pair.Value;
}//method
}//struct
public static void WriteXml<TKey,TValue>(XmlWriter writer, IDictionary<TKey,TValue> dict) {
var list = new List<Pair<TKey,TValue>>(dict.Count);
foreach (var pair in dict) {
list.Add(new Pair<TKey,TValue>(pair));
}//foreach
var serializer = new XmlSerializer(list.GetType());
serializer.Serialize(writer, list);
}//method
public static void ReadXml<TKey, TValue>(XmlReader reader, IDictionary<TKey, TValue> dict) {
reader.Read();
var serializer = new XmlSerializer(typeof(List<Pair<TKey,TValue>>));
var list = (List<Pair<TKey,TValue>>)serializer.Deserialize(reader);
foreach (var pair in list) {
dict.Add(pair.Key, pair.Value);
}//foreach
reader.Read();
}//method
}//class
}//namespace
Et un dictionnaire générique sérialisable pratique :
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
using System.Collections.Generic;
namespace GameSpace {
public class SerializableDictionary<TKey,TValue> : Dictionary<TKey,TValue>, IXmlSerializable {
public virtual void WriteXml(XmlWriter writer) {
XmlSerializerForDictionary.WriteXml(writer, this);
}//method
public virtual void ReadXml(XmlReader reader) {
XmlSerializerForDictionary.ReadXml(reader, this);
}//method
public virtual XmlSchema GetSchema() {
return null;
}//method
}//class
}//namespace
5 votes
La question est incorrecte, car elle ne tient pas compte de la cause et de l'effet. La question devrait être : "pourquoi
XmlSerializer
ne peut pas sérialiser les dictionnaires" ? Parce qu'il y a de nombreuses façons de faire de la sérialisation XML dans .NET, et la plupart d'entre elles sérialisent très bien les dictionnaires (DataContractSerializer
,SoapFormatter
...).0 votes
Je suppose que vous n'avez pas examiné "XmlDictionaryWriter.CreateDictionaryWriter"... ou les 100 autres façons de sérialiser les dictionnaires dans .NET (certaines d'entre elles sont intégrées). ...Par ailleurs, pourquoi avez-vous besoin d'un dictionnaire ? J'ai toujours trouvé que les objets à typage fort fonctionnaient mieux, pourquoi ne pas simplement implémenter une classe avec un [DataContract], et IExtensibleDataObject ?
0 votes
Quelles sont les fonctionnalités modernes de .NET qui, selon vous, dépendent de la sérialisation XML ? Les fichiers de configuration n'utilisent pas la sérialisation, et les services web ASMX ne sont destinés qu'à une utilisation patrimoniale. (déplacé dans le commentaire de la réponse)