反映类型的错误 – XML序列化问题
我有一个需要写入XML文件的Dictionary对象。 字典包含String类型作为Key,自定义类的Object(从System.Windows.Forms.Control派生)作为Value。
namespace SharpFormEditorDemo { [Serializable] public static class common { public static Dictionary dicControls = new Dictionary(); public static Object objSelected = new Object(); public static int ctrlId = 0; //The serialization and Deserialization methods. public static void Serialize(XmlTextWriter xmlTextWriter,Dictionary dic) { xmlTextWriter.WriteStartDocument(); ControlSerializer file = new ControlSerializer(dic); XmlSerializer xmlSerializer = new XmlSerializer(typeof(ControlSerializer)); xmlSerializer.Serialize(xmlTextWriter, file); xmlTextWriter.WriteEndDocument(); } }
CommonControl类是这样的
namespace SharpFormEditorDemo { public class CommonControl : System.Windows.Forms.Control { //private List controls; private String sql; private int minVal; //Minimum value for a field private int maxVal; //Maximum value for a field private string displayValue; //Display Value private string keyValue; //Key Value private string clickEvent; //Click event private string selectedIndexChangeEvent; //Combo box event. private string validateEvent; //Validated event. public string SelectedIndexChangeEvent { get { return selectedIndexChangeEvent; } set { selectedIndexChangeEvent = value; } } public string ClickEvent { get { return clickEvent; } set { clickEvent = value; } } public string ValidateEvent { get { return validateEvent; } set { validateEvent = value; } } public string KeyValue { get { return keyValue; } set { keyValue = value; } } public string DisplayValue { get { return displayValue; } set { displayValue = value; } } public int MinVal { get { return minVal; } set { minVal = value; } } public int MaxVal { get { return maxVal; } set { maxVal = value; } } public String Sql { get { return sql; } set { sql = value; } } //public List Controls //{ // get { return controls; } // set { controls = value; } //} } }
CommonControl类是从Controls类派生的。
我想要做的是将上述字典写入XML文件。
[Serializable] public class ControlSerializer : ISerializable { public ControlSerializer() { } private Dictionary dicCtrl; public Dictionary DicCtrl { get { return dicCtrl; } set { dicCtrl = value; } } public ControlSerializer(Dictionary dic) { this.DicCtrl = dic; } public void GetObjectData(SerializationInfo info, StreamingContext context) { throw new NotImplementedException(); } }
因为我正在使用ControlSerializer类
并称之为这样
try { XmlTextWriter xlw = new XmlTextWriter(@"D:\Test.xml", null); common.Serialize(xlw, common.dicControls); } catch (Exception exShow) {
问题是我得到一个例外,说“反映类型为’SharpFormEditorDemo.ControlSerializer’的错误。”
但我正在使用typeof运算符获取类型。 感到困惑的是为什么会这样。 对不起,如果我太长,但想要全面了解。
谢谢
通用词典不能是XmlSerialized。 您获得的错误是由公共属性DicCtrl
引起的。
- 使用
[XmlIgnore]
属性在序列化时跳过此属性(可能不是您想要的)。 - 将属性的类型更改为可序列化的类型,例如
List
- 查找或实现可序列化的字典
- 或者实现IXmlSerializable
BTW [Serializable]
属性仅用于二进制序列化。 你不需要它来进行Xml序列化。
伙计们……在网上给我一点帮助,我找到了一个解决方案..
我不得不添加另一个课程
[XmlRoot("dictionary")] public class SerializableDictionary: Dictionary, 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 }
然后使用SerializableDictionary对象而不是普通的Dictionary。 同样在我的CommonControls类中,我必须使用以下方法实现“IXmlSerializable”。
#region IXmlSerializable Members public System.Xml.Schema.XmlSchema GetSchema() { throw new NotImplementedException(); } public void ReadXml(XmlReader reader) { throw new NotImplementedException(); } public void WriteXml(XmlWriter writer) { throw new NotImplementedException(); } #endregion
现在整个事情都运转正常。 感谢大家。 !
我想你会发现无法用XmlSerializer
序列化Dictionary
我使用System.Runtime.Serialization.dll
DataContractSerializer
。 使用两个Dictionary属性对我的类进行序列化/反序列化,没有任何问题。