使用二进制序列化和使用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是不能序列化,因为这些类本身就没有标记为可序列化,他的继承类,或者包含他的实例的类也是不能够进行序列化的