序列化对象时出现问题

本文关键字:问题 对象 序列化 | 更新日期: 2023-09-27 18:06:40

我在c#中有这个类

public class ExerciseDTO {
    Dictionary<String, String> qa;
    private String materialId, content, topic;
    //constructors
    //properties
    public void makePersistent(String path) {
        Stream outputStream = File.OpenWrite(path + @"'" + this.topic + ".xml");
        XmlSerializer serializer = new XmlSerializer(typeof(ExerciseDTO));
        serializer.Serialize(outputStream, this);
        outputStream.Flush();
        outputStream.Close();
    }
}

调用makePersistent方法会使应用抛出异常,消息为An error occured while reflecting object of type ExerciseDTO。为什么我不能序列化这个类的实例?

序列化对象时出现问题

为什么我不能序列化这个类的实例?

因为XmlSerializer类不支持序列化Dictionary<TKey, TValue>属性。

作为另一种选择,您可以使用支持字典的DataContractSerializer

正如Darin所说,Dictionary是不可XML序列化的。您可以创建自己的XmlSerializableDictionary。网上有很多很好的例子。这里有一个:

http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx

如果链接将来失效,复制/粘贴:

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
}
[Serializable]
public class ExerciseDTO {
...
}
    你也应该有一个默认的(无参数的)构造函数如果你想要自动序列化你的属性,你也应该把它设为public
  • 字典<>的序列化不被。net支持,但是有一些变通方法,例如这篇文章。

编辑:如下所述:应该是" XmlSerializer类不支持字典<>的序列化"。