Jul
24
C#中的默认Directory<>不支持序列化,也就是说无法用序列化方式把数据进行XML文件操作,要序列化,须对其进行改造如下:
C# Code Copy Code To Clipboard
- /// <summary>
- /// 支持XML序列化的泛型 Dictionary
- /// </summary>
- /// <typeparam name="TKey"></typeparam>
- /// <typeparam name="TValue"></typeparam>
- [XmlRoot("SerializableDictionary")]
- public class SerializableDictionary<TKey, TValue>
- : Dictionary<TKey, TValue>, IXmlSerializable
- {
- #region 构造函数
- public SerializableDictionary()
- : base()
- {
- }
- public SerializableDictionary(IDictionary<TKey, TValue> dictionary)
- : base(dictionary)
- {
- }
- public SerializableDictionary(IEqualityComparer<TKey> comparer)
- : base(comparer)
- {
- }
- public SerializableDictionary(int capacity)
- : base(capacity)
- {
- }
- public SerializableDictionary(int capacity, IEqualityComparer<TKey> comparer)
- : base(capacity, comparer)
- {
- }
- protected SerializableDictionary(SerializationInfo info, StreamingContext context)
- : base(info, context)
- {
- }
- #endregion
- #region IXmlSerializable Members
- public System.Xml.Schema.XmlSchema GetSchema()
- {
- return null;
- }
- /// <summary>
- /// 从对象的 XML 表示形式生成该对象
- /// </summary>
- /// <param name="reader"></param>
- 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();
- }
- /**/
- /// <summary>
- /// 将对象转换为其 XML 表示形式
- /// </summary>
- /// <param name="writer"></param>
- 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
- }
用此类型定义的Directory<>变量,可以如下进行存取:
C# Code Copy Code To Clipboard
- public void Save(string filename)
- {
- System.IO.StreamWriter writer = new System.IO.StreamWriter(filename, false, System.Text.Encoding.UTF8);
- XmlSerializer ser = new XmlSerializer(MyClassInstanceName.GetType());
- ser.Serialize(writer, MyClassInstanceName);
- writer.Close();
- }
- public MyClassName Load(string filename)
- {
- System.IO.StreamReader reader = new System.IO.StreamReader(filename);
- XmlSerializer ser = new XmlSerializer(MyClassInstanceName.GetType());
- MyClassName result = new MyClassName ();
- result.MyClassInstanceName = (SerializableDictionary<string,int>)ser.Deserialize(reader);
- reader.Close();
- return result;
- }
Dec
14
C#中每个类都可以独立存为XML并从对应XML文件中读取. 具体操作如下:
1. 每个类的声明之前,要加XmlRoot()声明XML文件的根节点,比如:
C# Code Copy Code To Clipboard
- [Serializable]
- [XmlRoot("DBRStream")]
- public class DBRStream
- {
- ...
- }
2. 对于每一个类的公共成员,要加上如下声明:
C# Code Copy Code To Clipboard
- [XmlAttribute("Phaseid")]
- public int Phaseid
- {
- set { phaseid = value; }
- get { return phaseid; }
- }
3. 如果此公共成员是复杂类型,比如说是一个数组集合,则用XmlArray声明:
但是要注意的是多维数组无法序列化,在此情况下,只能先用个内部变量List<>来对[,]进行转化以便进行存取。
C# Code Copy Code To Clipboard
- [XmlArray("Fractions")]
- [XmlArrayItem("Fraction")]
- public List<double> Fraction
- {
- set { fraction = value; }
- get { return fraction; }
- }
4. 如果此公共成员是另一个类,则声明如下:
C# Code Copy Code To Clipboard
- [XmlElement(typeof(dbrcomponentlist))]
- public dbrcomponentlist Complist
- {
- set { complist = value; }
- get { return complist; }
- }
5. 如果此公共成员不需要保存到XML文件,则声明如下:
C# Code Copy Code To Clipboard
- [XmlIgnoreAttribute]
- public StreamType streamtype;
6. 保存操作:
C# Code Copy Code To Clipboard
- public void Save(string filename)
- {
- System.IO.StreamWriter writer = new System.IO.StreamWriter(filename, false, System.Text.Encoding.UTF8);
- XmlSerializer ser = new XmlSerializer(GetType());
- ser.Serialize(writer,this);
- writer.Close();
- }
7. 读取操作:
C# Code Copy Code To Clipboard
- public classDBRCalc Load(string filename)
- {
- System.IO.StreamReader reader = new System.IO.StreamReader(filename);
- XmlSerializer ser = new XmlSerializer(typeof(classDBRCalc));
- classDBRCalc result = (classDBRCalc)ser.Deserialize(reader);
- reader.Close();
- return result;
- }
- }



