Heim > Backend-Entwicklung > C++ > Wie serialisiere ich ein Wörterbuchmitglied in einer Klasse für Konfigurationsdateien?

Wie serialisiere ich ein Wörterbuchmitglied in einer Klasse für Konfigurationsdateien?

Mary-Kate Olsen
Freigeben: 2025-01-15 18:27:44
Original
709 Leute haben es durchsucht

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

Serialisieren Sie eine Klasse, die Wörterbuchmitglieder enthält

Beim Versuch, eine Klasse zu serialisieren, die Wörterbuchmitglieder enthält (z. B. eine Konfigurationsdateiklasse), kann die folgende Fehlermeldung auftreten:

<code>System.NotSupportedException: 无法序列化成员 App.Configfile.mappedDrives</code>
Nach dem Login kopieren

Dieser Fehler bedeutet, dass der Dictionary-Typ standardmäßig nicht direkt serialisiert werden kann. Um dieses Problem zu beheben, sollten Sie die Implementierung eines benutzerdefinierten Serialisierungsmechanismus in Betracht ziehen.

Benutzerdefinierte Wörterbuchserialisierung

Eine Möglichkeit besteht darin, eine benutzerdefinierte Klasse zu erstellen, die von Dictionary<TKey, TValue> erbt und die IXmlSerializable-Schnittstelle implementiert. Der folgende Codeausschnitt demonstriert diese Implementierung:

<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>
Nach dem Login kopieren

Benutzerdefinierte Wörterbücher können durch Implementierung von IXmlSerializable an der XML-Serialisierung teilnehmen.

Nutzung

Sobald ein benutzerdefiniertes Wörterbuch definiert ist, kann es zum Speichern der erforderlichen Schlüssel-Wert-Paare in der Profilklasse verwendet werden:

<code class="language-csharp">public class ConfigFile
{
    ...
    public SerializableDictionary<string, string> mappedDrives = new SerializableDictionary<string, string>();
    ...
}</code>
Nach dem Login kopieren

Mit diesem Ansatz können Konfigurationsdateiklassen serialisiert und deserialisiert werden, ohne dass Serialisierungsfehler auftreten.

Das obige ist der detaillierte Inhalt vonWie serialisiere ich ein Wörterbuchmitglied in einer Klasse für Konfigurationsdateien?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage