Maison > développement back-end > C++ > Comment sérialiser un membre de dictionnaire dans une classe pour les fichiers de configuration ?

Comment sérialiser un membre de dictionnaire dans une classe pour les fichiers de configuration ?

Mary-Kate Olsen
Libérer: 2025-01-15 18:27:44
original
709 Les gens l'ont consulté

How to Serialize a Dictionary Member in a Class for Configuration Files?

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal