经常有必要将对象的字段值存储至磁盘,以后再检索此数据。尽管不依赖序列化也能很容易地实现这一点,但方法通常麻烦而容易出错,并且需要跟踪对象的层次结构时会逐渐变得更加复杂。假设要编写一个包含数千个对象的大型商务应用程序,并且必须为每个对象编写代码,以便将字段和属性保存至磁盘以及从磁盘进行还原。序列化为实现这一目标提供了方便的机制。
公共语言运行库可管理对象在内存中存储的方式,并通过使用反射提供一种自动序列化机制。当序列化对象时,类的名称、程序集和类实例的所有数据成员被写入存储区。对象经常以成员变量方式将引用存储至其他实例。当序列化类时,序列化引擎跟踪被引用的对象(已序列化),以确保同一对象不会被多次序列化。随 .NET Framework 一起提供的序列化体系结构可自动正确地处理对象图和循环引用。对于对象图的唯一要求是,也必须将已序列化的对象引用的所有对象标记为 Serializable
如果未进行标记,序列化程序尝试序列化未标记的对象时将引发异常。
当反序列化已序列化的类时,将重新创建该类,并且将自动还原所有数据成员的值。
微软所谓的图形,应该是存储结构

Code
1 using System;
2 using System.Configuration;
3 using System.Data;
4 using System.Linq;
5 using System.Web;
6 using System.Web.Security;
7 using System.Web.UI;
8 using System.Web.UI.HtmlControls;
9 using System.Web.UI.WebControls;
10 using System.Web.UI.WebControls.WebParts;
11 using System.Xml.Linq;
12
13 public partial class _Default : System.Web.UI.Page
14 {
15 protected void Page_Load(object sender, EventArgs e)
16 {
17
18 }
19 protected void Button1_Click(object sender, EventArgs e)
20 {
21 string name=this.TextBox1.Text.Trim();
22 string pwd = this.TextBox2.Text.Trim();
23
24 //创建对象
25 UserInfo user = new UserInfo();
26 user.Name = name;
27 user.Pwd = pwd;
28
29
30 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
31 binary = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
32 System.IO.Stream stream = new System.IO.FileStream(string.Format("E:/{0}信息.bin", name), System.IO.FileMode.Create);
33
34
35 binary.Serialize(stream, user);
36 stream.Close();
37 }
38 protected void Button2_Click(object sender, EventArgs e)
39 {
40 string name=this.TextBox3.Text.Trim();
41
42 System.IO.DirectoryInfo di = new System.IO.DirectoryInfo("e:/");
43 System.IO.FileInfo[] fis = di.GetFiles(string.Format("{0}信息.bin", name));
44 if (fis.Length != 0)
45 {
46 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
47 binary = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
48 System.IO.Stream stream = fis[0].OpenRead();
49
50 Object obj=binary.Deserialize(stream);
51 UserInfo user = (UserInfo)obj;
52 this.Label2.Text = "用户名:" + user.Name + "\t密码:" + user.Pwd;
53 stream.Close();
54 }
55 else
56 {
57 this.Label2.Text = "服务器没有" + name + "的个人信息!";
58 }
59 }
60 }
61 [Serializable]
62 public class UserInfo
63 {
64 private string _name;
65 private string _pwd;
66
67 public string Name { get; set; }
68 public string Pwd { get; set; }
69 }
70