17,740
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using System.IO;
using System.Xml;
using System.Runtime.Serialization;
using System.Xml.Schema;
namespace XmlSerializationConsole
{
class Program
{
static void Main(string[] args)
{
DoSerialize();
DeSerialize();
}
static string strFile = "c:\\MySerialClass.xml";
public static void Serialize(MySerialClass mc)
{
using (FileStream fs = new FileStream(strFile, FileMode.Create))
{
XmlSerializer formatter = new XmlSerializer(typeof(MySerialClass));
formatter.Serialize(fs, mc);
}
}
public static MySerialClass DeSerialize()
{
MySerialClass mc;
using (FileStream fs = new FileStream(strFile, FileMode.Open))
{
XmlSerializer formatter = new XmlSerializer(typeof(MySerialClass));
mc = (MySerialClass)formatter.Deserialize(fs);
}
return mc;
}
private static void DoSerialize()
{
//this.graphControl1.Serialize();
MySerialClass mc = new MySerialClass();
Maker maker = new Maker("m1");
SerializableDictionary<Maker, Book> makerList = new SerializableDictionary<Maker, Book>();
//Book b = new Book("b1", makerList[0]);
Book b = new Book("b1", maker);
makerList.Add(maker, b);
mc.AllMakerBooks = makerList;
Serialize(mc);
}
private static void DoDeSerialize( )
{
//this.graphControl1.DeSerialize();
MySerialClass mc = DeSerialize();
}
}
[Serializable]
public class MySerialClass
{
public MySerialClass()
{
}
public SerializableDictionary<Maker, Book> AllMakerBooks
{
get;
set;
}
}
[Serializable]
public class Book
{
public string name;
public Maker maker;
public Book()
{
}
public Book(string name,Maker maker)
{
this.name = name;
this.maker = maker;
}
}
[Serializable]
public class Maker
{
public string name;
public Maker()
{
}
public Maker(string name)
{
this.name = name;
}
}
/// <summary>
/// 可序列化字典类
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TValue"></typeparam>
[XmlRoot("dictionary"), Serializable]
public class SerializableDictionary<TKey, TValue>
: Dictionary<TKey, TValue>, IXmlSerializable
{
public SerializableDictionary()
{
}
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)
{
}
#region IXmlSerializable Members
public XmlSchema GetSchema()
{
return null;
}
/// <summary>
/// 从对象的 XML 表示形式生成该对象
/// </summary>
/// <param name="reader"></param>
public void ReadXml(XmlReader reader)
{
var keySerializer = new XmlSerializer(typeof(TKey));
var valueSerializer = new XmlSerializer(typeof(TValue));
bool wasEmpty = reader.IsEmptyElement;
reader.Read();
if (wasEmpty)
return;
while (reader.NodeType != XmlNodeType.EndElement)
{
reader.ReadStartElement("item");
reader.ReadStartElement("key");
var key = (TKey)keySerializer.Deserialize(reader);
reader.ReadEndElement();
reader.ReadStartElement("value");
var value = (TValue)valueSerializer.Deserialize(reader);
reader.ReadEndElement();
Add(key, value);
reader.ReadEndElement();
reader.MoveToContent();
}
reader.ReadEndElement();
}
/// <summary>
/// 将对象转换为其 XML 表示形式
/// </summary>
/// <param name="writer"></param>
public void WriteXml(XmlWriter writer)
{
var keySerializer = new XmlSerializer(typeof(TKey));
var valueSerializer = new XmlSerializer(typeof(TValue));
foreach (TKey key in 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
}
}