一个简单的序列化与反序列化的例子

首先要引用一个命名空间
using System.Runtime.Serialization.Formatters.Binary;
接着就是对你要序列化的对象进行序列化了

 1 Hashtable searchlist = new Hashtable();
 2         searchlist.Add("2""3");
 3         // 序列化对象
 4         // 摘要:
 5         //     以二进制格式将对象或整个连接对象图形序列化和反序列化。
 6         BinaryFormatter binaryFormatter = new BinaryFormatter();
 7 
 8         // 创建一个内存流,序列化后保存在其中
 9         MemoryStream ms = new MemoryStream();
10 
11         //用与保存内存流中的字节块
12         byte[] b;
13 
14         // 将Hashtable对象(里面保存了所有的用户扩展信息)序列化为内存流
15         //
16         binaryFormatter.Serialize(ms, searchlist);
17 
18         // 设置内存流的起始位置
19         //
20         ms.Position = 0;
21 
22         // 读入到 byte 数组
23         //
24         b = new Byte[ms.Length];
25         // 摘要:Read()
26         //     从当前流中读取字节块并将数据写入 buffer 中。
27         //
28         // 参数:
29         //   offset:
30         //     buffer 中的字节偏移量,从此处开始读取。
31         //
32         //   count:
33         //     最多读取的字节数。
34         //
35         //   buffer:
36         //     当此方法返回时,包含指定的字节数组,该数组中从 offset 到 (offset + count -1) 之间的值由从当前流中读取的字符替换。 
37         //
38         // 返回结果:
39         //     写入缓冲区中的总字节数。如果当前可用字节数不到所请求的字节数,则这一总字节数可能小于所请求的字节数,或者如果在读取任何字节前已到达流的末尾,则为零。
40         ms.Read(b, 0, b.Length);
41 
42         // 摘要:ToBase64String()
43         //     将 8 位无符号整数数组的子集转换为其等效的、用以 64 为基的数字编码的 System.String 表示形式。参数指定是否在返回值中插入分行符。
44         //
45         // 参数:
46         //   options:
47         //     如果每 76 个字符插入一个分行符,则使用 System.Base64FormattingOptions.InsertLineBreaks,如果不插入分行符,则使用
48         //     System.Base64FormattingOptions.None。
49         //
50         //   inArray:
51         //     一个 8 位无符号整数数组。
52         //
53         // 返回结果:
54         //     inArray 中的元素的以 base 64 表示的 System.String 表示形式。
55         string b_data = Convert.ToBase64String(b,System.Base64FormattingOptions.None);
56         // 摘要:Close()
57         //     关闭当前流并释放与之关联的所有资源(如套接字和文件句柄)。
58         ms.Close();   
59         //测试用例,URL参数只能为字符型,所以之前要对BYTE数组进行转换    
60         this.Response.Redirect("b.aspx?test=" + b_data);


反序列化:
 1   //用与测试反序列化的HASHTABLE
 2         Hashtable userdata = new Hashtable();
 3         //从b页面传递过来的参数test,test是经过序列化的字符串
 4         if (this.Request["test"!= null)
 5         {  
 6 
 7             BinaryFormatter b = new BinaryFormatter();
 8 
 9             //同样先把字符转换为内存流可用的字节块
10             byte[] d_string = Convert.FromBase64String(this.Request["test"].ToString());
11 
12             //内存流读取字节块
13             MemoryStream m = new MemoryStream(d_string);
14             //反序列化内存流为HASHTABLE
15             userdata = (Hashtable)b.Deserialize(m, null);  
16     
17         }

注意:序列化后是A页面把序列化后的对象转化为字符传递给B页面,反序列化是B页面返回A页面,A页面读取B返回的经过序列化后的字符再把他反序列化为HASHTABLE

    项目中有一个奇怪的需求,就是从一览画面迁移到详细画面的时候,如果一览画面有条件,则从详细返回一览的时候在一览画面必须保持原有的条件。在一览画面有多个条件框的时候就想到用HASHTABLE的键值关系保存查询条件,于是就有了现在的例子。但是后面说,这样好象是杀鸡用牛刀,没什么必要,而且页不能用SESSION,总之,我想到的他们好象都不让用。最后,只能用了个最简单的方法,采用了,那就是带上一大堆的字符串。。。。= =
原文地址:https://www.cnblogs.com/ruanbl/p/831266.html