Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mensiri Ahli Kamus dalam Kelas untuk Fail Konfigurasi?

Bagaimana untuk Mensiri Ahli Kamus dalam Kelas untuk Fail Konfigurasi?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-15 18:27:44713semak imbas

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

Sirikan kelas yang mengandungi ahli kamus

Apabila cuba mensiri kelas yang mengandungi ahli kamus (seperti kelas fail konfigurasi), anda mungkin menghadapi ralat berikut:

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

Ralat ini bermakna secara lalai, jenis Kamus tidak boleh disiri secara langsung. Untuk menyelesaikan isu ini, pertimbangkan untuk melaksanakan mekanisme bersiri tersuai.

Siri kamus tersuai

Salah satu cara ialah mencipta kelas tersuai yang mewarisi daripada Dictionary<TKey, TValue> dan melaksanakan antara muka IXmlSerializable. Coretan kod berikut menunjukkan pelaksanaan ini:

<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>

Kamus tersuai boleh mengambil bahagian dalam siri XML dengan melaksanakan IXmlSerializable.

Penggunaan

Setelah kamus tersuai ditakrifkan, ia boleh digunakan untuk menyimpan pasangan nilai kunci yang diperlukan dalam kelas profil:

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

Dengan pendekatan ini, kelas fail konfigurasi boleh disiri dan dinyahsiri tanpa menghadapi ralat bersiri.

Atas ialah kandungan terperinci Bagaimana untuk Mensiri Ahli Kamus dalam Kelas untuk Fail Konfigurasi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn