SORU
30 Ocak 2009, Cuma


Seri hale getirmek Sınıf içeren Sözlük üyesi

** 9, genişleyen üzerine harika çalıştı (de)yapılandırma dosyası benim sınıf seri hale getirmek için karar verdi.

Ben şimdi istiyorum saklamak için bir ilişkisel dizi sürücü harflerini göster (anahtar sürücü harfi, değer ağ yolu) ve çalıştı kullanarak Dictionary, HybridDictionary Hashtable için bu ama hep aşağıdaki hatayı çağırırken ConfigFile.Load() ConfigFile.Save():

Bir hata türü yansıtan vardı 'App.'. ConfigFile [kelepir] Sistem.NotSupportedException: seri hale getirmek üyesi App.Configfile.mappedDrives [kelepir]

Okuduğum kadarıyla Sözlük ve HashTables seri olabilir, neyi yanlış yapıyorum?

[XmlRoot(ElementName="Config")]
public class ConfigFile
{
    public String guiPath { get; set; }
    public string configPath { get; set; }
    public Dictionary<string, string> mappedDrives = new Dictionary<string, string>();

    public Boolean Save(String filename)
    {
        using(var filestream = File.Open(filename, FileMode.OpenOrCreate,FileAccess.ReadWrite))
        {
            try
            {
                var serializer = new XmlSerializer(typeof(ConfigFile));
                serializer.Serialize(filestream, this);
                return true;
            } catch(Exception e) {
                MessageBox.Show(e.Message);
                return false;
            }
        }
    }

    public void addDrive(string drvLetter, string path)
    {
        this.mappedDrives.Add(drvLetter, path);
    }

    public static ConfigFile Load(string filename)
    {
        using (var filestream = File.Open(filename, FileMode.Open, FileAccess.Read))
        {
            try
            {
                var serializer = new XmlSerializer(typeof(ConfigFile));
                return (ConfigFile)serializer.Deserialize(filestream);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message   ex.ToString());
                return new ConfigFile();
            }
        }
    }
}

CEVAP
13 Kasım 2009, Cuma


Paul Welter's Weblog - XML Serializable Generic Dictionary bir çözüm var

Nedense, genel Sözlük .net 2.0 değil XML seri hale getirilebilir. Aşağıdaki kod parçacığını xml seri hale getirilebilir genel bir sözlüktür. Sözlük IXmlSerializable arabirimini uygulayarak serialzable.

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;

[XmlRoot("dictionary")]
public class SerializableDictionary<TKey, TValue>
    : Dictionary<TKey, TValue>, IXmlSerializable
{
    #region IXmlSerializable Members
    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
    }

    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();
        }
    }
    #endregion
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Apple

    Apple

    22 HAZİRAN 2005
  • Michael Zhang

    Michael Zhan

    8 EYLÜL 2012
  • SolidWorksTutoriels

    SolidWorksTu

    14 Kasım 2013