首先要引用一个命名空间
反序列化:
注意:序列化后是A页面把序列化后的对象转化为字符传递给B页面,反序列化是B页面返回A页面,A页面读取B返回的经过序列化后的字符再把他反序列化为HASHTABLE
项目中有一个奇怪的需求,就是从一览画面迁移到详细画面的时候,如果一览画面有条件,则从详细返回一览的时候在一览画面必须保持原有的条件。在一览画面有多个条件框的时候就想到用HASHTABLE的键值关系保存查询条件,于是就有了现在的例子。但是后面说,这样好象是杀鸡用牛刀,没什么必要,而且页不能用SESSION,总之,我想到的他们好象都不让用。最后,只能用了个最简单的方法,采用了,那就是带上一大堆的字符串。。。。= =
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);
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 }
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,总之,我想到的他们好象都不让用。最后,只能用了个最简单的方法,采用了,那就是带上一大堆的字符串。。。。= =