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,总之,我想到的他们好象都不让用。最后,只能用了个最简单的方法,采用了,那就是带上一大堆的字符串。。。。= =
  • 相关阅读:
    c#以文件流的形式输出xml(可以解决内存溢出)-XmlTextWriter
    c# 大数据量比较时-方案
    c# 大数据量比较时-方案
    sql中插入多条记录-微软批处理
    sql中插入多条记录-微软批处理
    c#上传图片
    c#上传图片
    sql 数据库优化
    mysql处理旧数据-使用模板以及临时表,不建议直接使用本表!!
    margin-bottom无效问题以及div里内容动态居中样式!
  • 原文地址:https://www.cnblogs.com/ruanbl/p/831266.html
Copyright © 2011-2022 走看看