Maison >développement back-end >C++ >Comment sérialiser un membre de dictionnaire dans une classe pour les fichiers de configuration ?
Sérialiser une classe contenant des membres du dictionnaire
Lorsque vous essayez de sérialiser une classe contenant des membres de dictionnaire (comme une classe de fichier de configuration), vous pouvez rencontrer l'erreur suivante :
<code>System.NotSupportedException: 无法序列化成员 App.Configfile.mappedDrives</code>
Cette erreur signifie que par défaut, le type Dictionnaire ne peut pas être sérialisé directement. Pour résoudre ce problème, envisagez d'implémenter un mécanisme de sérialisation personnalisé.
Sérialisation de dictionnaire personnalisé
Une solution consiste à créer une classe personnalisée qui hérite de Dictionary<TKey, TValue>
et implémente l'interface IXmlSerializable
. L'extrait de code suivant illustre cette implémentation :
<code class="language-csharp">using System; using System.Collections.Generic; using System.Xml.Serialization; [XmlRoot("dictionary")] public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable { public void ReadXml(System.Xml.XmlReader reader) { XmlSerializer keySerializer = new XmlSerializer(typeof(TKey)); XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue)); bool wasEmpty = reader.IsEmptyElement; reader.Read(); if (wasEmpty) return; while (reader.NodeType != System.Xml.XmlNodeType.EndElement) { reader.ReadStartElement("item"); reader.ReadStartElement("key"); TKey key = (TKey)keySerializer.Deserialize(reader); reader.ReadEndElement(); reader.ReadStartElement("value"); TValue value = (TValue)valueSerializer.Deserialize(reader); reader.ReadEndElement(); this.Add(key, value); reader.ReadEndElement(); reader.MoveToContent(); } reader.ReadEndElement(); } public void WriteXml(System.Xml.XmlWriter writer) { XmlSerializer keySerializer = new XmlSerializer(typeof(TKey)); XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue)); foreach (TKey key in this.Keys) { writer.WriteStartElement("item"); writer.WriteStartElement("key"); keySerializer.Serialize(writer, key); writer.WriteEndElement(); writer.WriteStartElement("value"); TValue value = this[key]; valueSerializer.Serialize(writer, value); writer.WriteEndElement(); writer.WriteEndElement(); } } }</code>
Les dictionnaires personnalisés peuvent participer à la sérialisation XML en implémentant IXmlSerializable
.
Utilisation
Une fois qu'un dictionnaire personnalisé est défini, il peut être utilisé pour stocker les paires clé-valeur requises dans la classe de profil :
<code class="language-csharp">public class ConfigFile { ... public SerializableDictionary<string, string> mappedDrives = new SerializableDictionary<string, string>(); ... }</code>
Avec cette approche, les classes de fichiers de configuration peuvent être sérialisées et désérialisées sans rencontrer d'erreurs de sérialisation.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!