C# 中字体和颜色的XML序列化

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






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值