zoukankan      html  css  js  c++  java
  • 一个简单的序列化与反序列化的例子

    首先要引用一个命名空间
    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,总之,我想到的他们好象都不让用。最后,只能用了个最简单的方法,采用了,那就是带上一大堆的字符串。。。。= =
  • 相关阅读:
    bzoj 1017 魔兽地图DotR
    poj 1322 chocolate
    bzoj 1045 糖果传递
    poj 3067 japan
    timus 1109 Conference(二分图匹配)
    URAL 1205 By the Underground or by Foot?(SPFA)
    URAL 1242 Werewolf(DFS)
    timus 1033 Labyrinth(BFS)
    URAL 1208 Legendary Teams Contest(DFS)
    URAL 1930 Ivan's Car(BFS)
  • 原文地址:https://www.cnblogs.com/ruanbl/p/831266.html
Copyright © 2011-2022 走看看