[英]There was an error reflecting type - XML Serialization issue
我有一個Dictionary對象需要寫入XML文件。 字典包含String類型作為Key,自定義類的Object(從System.Windows.Forms.Control派生)作為Value。
namespace SharpFormEditorDemo
{
[Serializable]
public static class common
{
public static Dictionary<String,CommonControl > dicControls = new Dictionary<string, CommonControl>();
public static Object objSelected = new Object();
public static int ctrlId = 0;
//The serialization and Deserialization methods.
public static void Serialize(XmlTextWriter xmlTextWriter,Dictionary<String,CommonControl> 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<String> 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<String> Controls
//{
// get { return controls; }
// set { controls = value; }
//}
}
}
CommonControl類是從Controls類派生的。
我想要做的是將上述字典寫入XML文件。
[Serializable]
public class ControlSerializer : ISerializable
{
public ControlSerializer()
{
}
private Dictionary<String, CommonControl> dicCtrl;
public Dictionary<String, CommonControl> DicCtrl
{
get { return dicCtrl; }
set { dicCtrl = value; }
}
public ControlSerializer(Dictionary<String, CommonControl> 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<T>
BTW [Serializable]
屬性僅用於二進制序列化。 Xml序列化不需要它。
伙計們......在網上給我一點幫助,我找到了一個解決方案..
我不得不添加另一個課程
[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
}
然后使用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屬性對我的類進行序列化/反序列化,沒有任何問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.