使用二进制序列化和使用xml序列化

WinForm程序中,经常需要保存一些用户的本地配置,

这些设置的特点是:

1、安装的时候可以选择风格。

2、用户可以设置自己的风格,保存,再打开的时候应用这些风格。

这个时候可以使用将类的实例序列化,然后保存在文件中,每次启动程序的时候从中读取,保存设置的时候再写入,

所以要用到序列化。

序列化的方法很多,我这里主要介绍两种

需要被序列化的类用一个简单的Person类来代替

[Serializable]
    public class Person
    {
        public Person()
        {
            this.Sex = "男";
        }

        /// <summary>
        /// 名
        /// </summary>
        public string FirstName { set; get; }
        /// <summary>
        /// 姓
        /// </summary>
        public string LastName { set; get; }
        /// <summary>
        /// 年龄
        /// </summary>
        public int Age { set; get; }
        /// <summary>
        /// 性别
        /// </summary>
        private string Sex { set; get; }

一、二进制序列化

程序代码如下

public static class FileBinaryFormatter
    {

        /// <summary>
        /// 序列化文件
        /// </summary>
        /// <param name="bf"></param>
        /// <param name="tfs"></param>
        /// <returns></returns>
        public static bool FileSerialize(this BinaryFormatter bf, List<TrainingFile> tfs)
        {
            try
            {
                FileStream fs = new FileStream("Style",FileMode.Create);
                bf.Serialize(fs, tfs);
                fs.Dispose();
                fs.Close();
                return true;
            }
            catch (Exception e)
            {
                return false;
                throw e;
            }
        }
        /// <summary>
        /// 反序列化文件
        /// </summary>
        /// <param name="bf"></param>
        /// <returns></returns>
        public static List<TrainingFile> FileDeserialize(this BinaryFormatter bf)
        {
            try
            {
                FileStream fs = new FileStream("Style", FileMode.OpenOrCreate);
                if (fs.Length==0)
                {
                    fs.Dispose();
                    fs.Close();
                    return null;
                }
                List<TrainingFile> t = new List<TrainingFile>();
                if (fs!=null&&fs.Length>0)
                {
                    t = bf.Deserialize(fs) as List<TrainingFile>;
                    fs.Dispose();
                    fs.Close();
                }
                return t;
            }
            catch (Exception e)
            {
                return null;
                throw e;
            }
        }
    }

这里用到扩展方法,这个类实际上是扩展了BinaryFormatter的方法,

这里特别需要注意的是在反序列化的时候,如果配置文件中为空,是会引发一个异常的

所以提前判断一下

                if (fs.Length==0)
                {
                    fs.Dispose();
                    fs.Close();
                    return null;
                }

调用代码如下:

序列化:

            Person p=new Person();

            BinaryFormatter bf = new BinaryFormatter();
            if (!bf.FileSerialize(p))
            {
                MessageBox.Show("写入文件失败");
            }

反序列化:

            BinaryFormatter bf = new BinaryFormatter();
            p = bf.FileDeserialize() as Person;

 

二、XML序列化

XML序列化的方法也类似,可以序列化到xml文件或者是txt文件中

XmlSerializer xs;

序列化:

Person p = new Person() { FirstName="Ron", LastName="Atest", Age=25};
fs= new FileStream(“style.xml”,FileMode.Create);
xs.Serialize(fs,p);
fs.Close();

反序列化:

fs = new FileStream((“style.xml”,FileMode.Open);
Person p =xs.Deserialize(fs) as Person;

三、总结:

两种方法对比需要注意以下几点:

1、二进制序列化生成的文件用文本文档打开之后显示的是乱码,也就是说不能直接读取。而xml生成的文件结构就是标准的xml文件结构。

2、二进制序列化可以将类的所有属性序列化,xml序列化的时候只是将public的属性序列化

3、也可以将List<Person>的实例序列化,但是注意有些类,比如FileInfo是不能序列化,因为这些类本身就没有标记为可序列化,他的继承类,或者包含他的实例的类也是不能够进行序列化的

posted @ 2008-12-25 15:25  小鲨  阅读(574)  评论(0编辑  收藏  举报