C#中提供的XmlSerializer类可以将Object序列化到xml文档,也可以从xml文档中反序列化对象
XmlSerializer中的Serialize和Deserialize方法可以用于Object的序列化和反序列化,代码如下:
public static void SerializeXml<T>(T obj, string fileName)
{
using (System.IO.StreamWriter writer = new System.IO.StreamWriter(fileName))
{
System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer(obj.GetType());
xmlSerializer.Serialize(writer, obj);
}
}
public static T DeserializeXml<T>(string fileName)
{
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(T));
using (System.IO.StreamReader reader = new System.IO.StreamReader(fileName))
{
return (T)serializer.Deserialize(reader);
}
}
但是要注意的是,XmlSerializer中的方法无法把Font和Color 类型的对象序列化(反序列化),要序列化Font或Color类型的对象,需要添加一些代码
1.System.Drawing.Color
颜色的表示方式一般分为用颜色的名称或RGB值,所以先建立一个颜色表示方式的枚举
public enum ColorFormat
{
NamedColor,
ARGBColor
}
我们通过Color.IsNamedColor属性来判断Color的表示方式是上述的哪种
public string SerializeColor(Color color)
{
if( color.IsNamedColor )
return string.Format("{0}:{1}",
ColorFormat.NamedColor, color.Name);
else
return string.Format("{0}:{1}:{2}:{3}:{4}",
ColorFormat.ARGBColor,
color.A, color.R, color.G, color.B);
}
因为XmlSerializer无法序列化Color类型的对象,所以添加一个方法把Color转换为String类型后再序列化,当然转换前要判断Color的表示方式。
Color的反序列化也一样,就是把String转换为Color
public Color DeserializeColor(string color)
{
byte a, r, g, b;
string [] pieces = color.Split(new char[] {':'});
ColorFormat colorType = (ColorFormat)
Enum.Parse(typeof(ColorFormat), pieces[0], true);
switch(colorType)
{
case ColorFormat.NamedColor:
return Color.FromName(pieces[1]);
case ColorFormat.ARGBColor:
a = byte.Parse(pieces[1]);
r = byte.Parse(pieces[2]);
g = byte.Parse(pieces[3]);
b = byte.Parse(pieces[4]);
return Color.FromArgb(a, r, g, b);
}
return Color.Empty;
}
然后就是Color的使用了,方法参考下面的代码
[Browsable(true)]
[Description("A complex object")]
[DefaultValue(typeof(Color), "Black")]
[XmlIgnore()] // Needed because the XmlSerializer can't handle Color objects
public Color ColorType
{
get
{
return (Color) settings["color"];
}
set
{
settings["color"] = value;
}
}
[Browsable(false)]
[XmlElement("ColorType")]
public string XmlColorType
{
get
{
return Settings.SerializeColor(ColorType);
}
set
{
ColorType = Settings.DeserializeColor(value);
}
}
[XmlIgnore()] 属性告诉XmlSerializer当序列化某个类的实例时,忽略这个属性(因为XmlSerializer无法自动处理Color类型的变量)
Settings就是这个方法所在的这个类
2.System.Drawing.Font
Font的处理方法和Color有些区别,因为Font包含了Bold,FontFamily能多个属性
public struct XmlFont
{
public string FontFamily;
public GraphicsUnit GraphicsUnit;
public float Size;
public FontStyle Style;
public XmlFont(Font f)
{
FontFamily = f.FontFamily.Name;
GraphicsUnit = f.Unit;
Size = f.Size;
Style = f.Style;
}
<span style="white-space:pre"> </span>public Font ToFont()
{
return new Font(FontFamily, Size, Style, GraphicsUnit);
}
}
这里用了一个struct来存储Font中的属性,这里只存储了Font的几个常用属性,如果想把Font中的所有属性都保存,一个通过一个Class来替代Struct
protected static XmlFont SerializeFont(Font font)
{
return new XmlFont(font);
}
protected static Font DeserializeFont(XmlFont font)
{
return font.ToFont();
}
Font的使用如下
[Browsable(true)]
[XmlIgnore()]
public Font FontObject
{
get
{
return (Font) settings["font"];
}
set
{
settings["font"] = value;
}
}
[Browsable(false)]
[XmlElement("FontObject")]
public XmlFont XmlFontObject
{
get
{
<span style="white-space:pre"> </span>return Settings.SerializeFont(FontObject);
}
set
{
FontObject = Settings.DeserializeFont(value);
}
}
示例下载链接:
http://download.csdn.net/detail/openzpc/9050605