.net开发之余,经常发现类上方有一个属性[Serializable].当时很是好奇,同事也经常问我,于是乎自己调查吧,终于领悟,跟大家分享。
Serializable:顾名思义序列化。用[Serializable]修饰类表示该类可以序列化。那么什么是序列化呢?
序列化就是将对象的状态信息转换为可以存储或传输的Object的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
序列化的目的:
1. 以某种存储形式使自定义对象持久化;(关于持久化一会儿再说)
2. 将对象从一个地方传递到另一个地方(详细见序列化part2)。
.NET Framework 提供两种序列化技术:
1. 二进制序列化,保持类型保真度,这对于在应用程序的不同调用之间保留对象的状态很有用。例如,通过将对象序列化到剪贴板,可在不同的应用程序之间共享对象。您可以将对象序列化到流、磁盘、内存和网络等等。
2. XML序列化,仅序列化公共属性和字段,且不保持类型保真度。当您要提供或使用数据而不限制使用该数据的应用程序时,这一点是很有用的。由于 XML 是一个开放式标准,因此,对于通过 Web 共享数据而言,这是一个很好的选择。
说了这么多,还不如来个例子更通俗易懂。
下面说个2进制序列化的例子。
//表示Book类可以序列化
[Serializable]
public class Book
{
private string name;
private float price;
private string author;
public Book(string bookname, float bookprice, string bookauthor)
{
this.name = bookname;
this.price = bookprice;
this.author = bookauthor;
}
public string Name
{
get
{
return this.name;
}
}
public float Price
{
get
{
return this.price;
}
}
public string Author
{
get
{
return this.author;
}
}
}
//程序入口Main函数
public class Start
{
static void Main(string[] args)
{
//生成一个Book类的实例
Book book = new Book("Day and Night", 30.0f, "Bruce");
//将book对象序列成2进制文件保存在F:/book.dat中。打开book.dat会出现乱码
using (FileStream fs = new FileStream(@"F:/book.dat", FileMode.Create))
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(fs, book);//二进制序列化
}
book = null;
//从F:/book.dat中将Book类的实例book反序列化。
using (FileStream fs = new FileStream(@"F:/book.dat", FileMode.Open))
{
BinaryFormatter formatter = new BinaryFormatter();
book=(Book)formatter.Deserialize(fs);
}
Console.WriteLine("BookName:" + book.Name);
Console.WriteLine("BookPrice:" + book.Price.ToString());
Console.WriteLine("BookAuthor:" + book.Author);
}
}
结果:
BookName:Day and Nigh
BookPrice:30
BookAuthor:Bruce
通过例子可以看出来,将对象的信息保存在文件中,以后使用时只需反序列化即可还原数据。
上面关于对象的持久化,我来说一说
简单的讲,“持久化” 持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。