序列化”可被定义为将对象的状态存储到存储媒介中的过程。在此过程中,对象的公共字段和私有字段以及类的名称(包括包含该类的程序集)都被转换为字节流,然后写入数据流。在以后“反序列化”该对象时,创建原始对象的精确复本。
一、为什么要选择序列化
一个原因是将对象的状态保持在存储媒体中,以便可以在以后重新创建精确的副本;
另一个原因是通过值将对象从一个应用程序域发送到另一个应用程序域中。
例如,序列化可用于在 ASP.NET 中保存会话状态并将对象复制到 Windows 窗体的剪贴板中。远程处理还可以使用序列化通过值将对象从一个应用程序域传递到另一个应用程序域中。
二、如何实现对象的序列化及反序列化
要实现对象的序列化,首先要保证该对象可以序列化。而且,序列化只是将对象的属性进行有效的保存,对于对象的一些方法则无法实现序列化的。
实现一个类可序列化的最简便的方法就是增加Serializable属性标记类。如:
Code
[Serializable]//加上这个才能序列化
public class Teacher
{
public string ID;
public string Name;
public Teacher(string ID,string Name)
{
this.ID = ID;
this.Name = Name;
}
public Teacher()
{
}
}
要将该类的实例序列化为到文件中?.NET FrameWork提供了两种方法:
1、XML序列化
使用 XmLSerializer 类,可将下列项序列化。
- 公共类的公共读/写属性和字段
- 实现 ICollection 或 IEnumerable 的类。(注意只有集合会被序列化,而公共属性却不会。)
- XmlElement 对象。
- XmlNode 对象。
- DataSet 对象。
要实现上述类的实例的序列化,可参照如下例子:
Code
/// <summary>
/// XML序列化,将对象保存为XML文件
/// </summary>
private static void XMLSerialize()
{
Teacher t = new Teacher("R9800","R9800 Advisor");
XmlSerializer ser = new XmlSerializer(typeof(Teacher));
FileStream fileStream = new FileStream(@"E:\XMLSerialize.xml", FileMode.Create, FileAccess.Write);
ser.Serialize(fileStream,t);
fileStream.Close();
}
/// <summary>
/// XML反序列化
/// </summary>
private static void XMLDeserialize()
{
XmlSerializer ser = new XmlSerializer(typeof(Teacher));
FileStream fileStream = new FileStream(@"E:\XMLSerialize.xml", FileMode.Open, FileAccess.Read);
Teacher t = (Teacher)ser.Deserialize(fileStream);
System.Diagnostics.Debug.WriteLine(t.ID+t.Name);
}
2、二进制序列化
与XML序列化不同的是,二进制序列化可以将类的实例中所有字段(包括私有和公有)都进行序列化操作。这就更方便、更准确的还原了对象的副本。
要实现上述类的实例的序列化,可参照如下例子:
Code
/// <summary>
/// 二进制序列化,将对象保存为文件
/// </summary>
private static void BinarySerialize()
{
Teacher t = new Teacher("R9800","R9800 Advisor");
BinaryFormatter formatter = new BinaryFormatter();
FileStream fileStream = File.Create(@"E:\BinarySerializetText.txt");
formatter.Serialize(fileStream, t);
fileStream.Close();
}
/// <summary>
/// 二进制反序列化,将文件读取为对象
/// </summary>
private static void BinaryDeserialize()
{
BinaryFormatter derializer=new BinaryFormatter();
FileStream fileStream = new FileStream(@"E:\BinarySerializetText.txt", FileMode.Open, FileAccess.Read, FileShare.Read);
Teacher t = (Teacher)derializer.Deserialize(fileStream);
System.Diagnostics.Debug.WriteLine(t.ID+t.Name);
fileStream.Close();
}