1

私のプログラムでは、いくつかのデータをカスタム オブジェクトに保存します。

    [Serializable]
    [XmlInclude(typeof(MsgTimerSettings))]
    public class MsgTimerSettings
    {
        public string t_name { get; set; }
        public string t_subj { get; set; }
        public string t_nmsg { get; set; }
        public UUID t_attach { get; set; }
        public string t_attachName { get; set; }
        public Dictionary<string, UUID> t_ngroups { get; set; }
        public Dictionary<string, UUID> t_imgroups { get; set; }
        public string t_IMmsg { get; set; }
        public string t_SLURL { get; set; }
        public int t_Type { get; set; }
        public int t_IMsetting { get; set; }
        public int t_ImgIndex { get; set; }
        public bool t_StartNow { get; set; }
        public DateTime t_StartTime { get; set; }
        public bool t_EndAt { get; set; }
        public DateTime t_EndTime { get; set; }
        public int t_Number { get; set; }
        public string t_Period { get; set; }
        public int t_Interval { get; set; }
        public bool t_Active { get; set; }
    }

これらの各オブジェクトは Dictionary(Dictionary MsgTimers;) に格納されます。辞書キーはタイマーの名前です。

次に、これらの各オブジェクトを XML ファイルに保存して、次にプログラムを起動したときにタイマーを読み戻せるようにします。

辞書はシリアル化できないことを知っており、問題を回避するためのさまざまな解決策を見つけようとしましたが、役に立ちませんでした。

http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspxに示されている SerializableDictionary 回避策を使用して、シリアライズ可能な辞書を作成しようとしましたが、辞書を SerializableDictionaries にするだけではありません。 、私はまだ手がかりがありません...

シリアル化しようとしたコードは次のとおりです。

    static public void SerializeToXML(SerializableDictionary<string, object> ST)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(SerializableDictionary<string,object>));
        TextWriter textWriter = new StreamWriter(@"C:\ST.xml");
        serializer.Serialize(textWriter, ST);
        textWriter.Close();
    }

誰かが私を助けてくれることを願っています。

4

1 に答える 1

0

シリアライズ可能なディクショナリを導入せずにディクショナリをシリアライズ/デシリアライズするには、次のクラスを使用します。

public class DictionarySerializer : IXmlSerializable
{
    private Dictionary<string, object> _dictionary;

    private DictionarySerializer()
    {
        this._dictionary = new Dictionary<string,object>();
    }

    private DictionarySerializer(Dictionary<string, object> dictionary)
    {
        this._dictionary = dictionary;
    }

    public static void Serialize(StreamWriter stream, Dictionary<string, object> dictionary)
    {
        DictionarySerializer ds = new DictionarySerializer(dictionary);
        XmlSerializer xs = new XmlSerializer(typeof(DictionarySerializer));
        xs.Serialize(stream, ds);
    }

    public static void Serialize(Stream stream, Dictionary<string, object> dictionary)
    {
        DictionarySerializer ds = new DictionarySerializer(dictionary);
        XmlSerializer xs = new XmlSerializer(typeof(DictionarySerializer));
        xs.Serialize(stream, ds);
    }

    public static Dictionary<string, object> Deserialize(Stream stream)
    {
        XmlSerializer xs = new XmlSerializer(typeof(DictionarySerializer));
        DictionarySerializer ds = (DictionarySerializer)xs.Deserialize(stream);
        return ds._dictionary;
    }

    public static Dictionary<string, object> Deserialize(TextReader stream)
    {
        XmlSerializer xs = new XmlSerializer(typeof(DictionarySerializer));
        DictionarySerializer ds = (DictionarySerializer)xs.Deserialize(stream);
        return ds._dictionary;
    }

    XmlSchema IXmlSerializable.GetSchema()
    {
        return null;
    }

    void IXmlSerializable.ReadXml(XmlReader reader)
    {
        reader.Read();
        ReadFromXml(reader);
    }

    private void ReadFromXml(XmlReader reader)
    {
        reader.ReadStartElement("dictionary");
        while (reader.NodeType != XmlNodeType.EndElement)
        {
            reader.ReadStartElement("item");
            string key = reader.ReadElementString("key");
            reader.ReadStartElement("value");
            object value = null;
            if (reader.Name == string.Empty)
            {
                value = reader.Value;
                reader.Read();
            }
            else if (reader.Name == "dictionary")
            {
                DictionarySerializer innerSerializer = new DictionarySerializer();
                innerSerializer.ReadFromXml(reader);
                value = innerSerializer._dictionary;
            }
            reader.ReadEndElement();
            reader.ReadEndElement();
            reader.MoveToContent();
            _dictionary.Add(key, value);
        }
        reader.ReadEndElement();
    }


    void IXmlSerializable.WriteXml(XmlWriter writer)
    {
        writer.WriteStartElement("dictionary");
        foreach (string key in _dictionary.Keys)
        {
            object value = _dictionary[key];
            writer.WriteStartElement("item");
            writer.WriteElementString("key", key.ToString());
            if (value is Dictionary<string, object>)
            {
                writer.WriteStartElement("value");
                IXmlSerializable aSer = new DictionarySerializer((Dictionary<string, object>)value);
                aSer.WriteXml(writer);
                writer.WriteEndElement();
            }
            else
                writer.WriteElementString("value", value.ToString());
            writer.WriteEndElement();
        }
        writer.WriteEndElement();
    }
}

次に、この種のコードを使用して、辞書をシリアル化/逆シリアル化します。

        Dictionary<string, object> d = new Dictionary<string, object>();
        // fill the dictionary
        StreamWriter sw = new StreamWriter(pth);
        DictionarySerializer.Serialize(sw, d);
        sw.Close();

        StreamReader sr = new StreamReader(pth);
        Dictionary<string, object> d2 = DictionarySerializer.Deserialize(sr);
        sr.Close();
于 2012-07-13T12:33:48.500 に答える