ホームページ > バックエンド開発 > C++ > 構成ファイルのクラス内のディクショナリ メンバーをシリアル化するにはどうすればよいですか?

構成ファイルのクラス内のディクショナリ メンバーをシリアル化するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2025-01-15 18:27:44
オリジナル
708 人が閲覧しました

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

辞書メンバーを含むクラスをシリアル化します

ディクショナリ メンバーを含むクラス (構成ファイル クラスなど) をシリアル化しようとすると、次のエラーが発生する場合があります:

<code>System.NotSupportedException: 无法序列化成员 App.Configfile.mappedDrives</code>
ログイン後にコピー

このエラーは、デフォルトでは Dictionary 型を直接シリアル化できないことを意味します。この問題を解決するには、カスタムのシリアル化メカニズムを実装することを検討してください。

カスタム辞書のシリアル化

1 つの方法は、Dictionary<TKey, TValue> を継承し、IXmlSerializable インターフェースを実装するカスタム クラスを作成することです。次のコード スニペットは、この実装を示しています:

<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>
ログイン後にコピー

カスタム辞書は、IXmlSerializable を実装することで XML シリアル化に参加できます。

使用法

カスタム辞書を定義したら、それを使用して必要なキーと値のペアをプロファイル クラスに保存できます。

<code class="language-csharp">public class ConfigFile
{
    ...
    public SerializableDictionary<string, string> mappedDrives = new SerializableDictionary<string, string>();
    ...
}</code>
ログイン後にコピー

このアプローチを使用すると、シリアル化エラーが発生することなく、構成ファイル クラスをシリアル化および逆シリアル化できます。

以上が構成ファイルのクラス内のディクショナリ メンバーをシリアル化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート