zoukankan      html  css  js  c++  java
  • Asp.Net Forums中对.Net中序列化和反序列化的应用

    Asp.Net Forums中对.Net中序列化和反序列化的应用

    在Forums中,有些内容是不固定的,例如用户资料,除了一些基本资料,可能还要有一些其他资料信息,例如MSN、个人主页、签名档等,一般对于这样的都是每一个属性对应于数据库中的一个字段。但是如果以后我们因为需要增加一些属性,例如QQ号、Blog地址等,如果还是用这种增加数据表字段的方法,那么将会频繁的修改数据库表结构、存储过程、数据库访问的程序。

    或许您也遇到过类似问题,看Forums中是怎么借用.Net的序列化和反序列化来解决的:
    例如我需要在用户资料里面增加QQ号这个属性,那么我只需要在User类中增加一个属性
    public String QQIM 
    {
        get { return GetExtendedAttribute("QQIM"); }
        set { SetExtendedAttribute("QQIM", value); }
    }
    不需要修改数据库表结构,不需要修改存储过程,连数据库访问的程序都不需要动。

    其具体实现的主要代码:

    // 首先新建在User类中新建一个NameValueCollection对象,将这些扩展属性都保存在NameValueCollection对象中
    NameValueCollection extendedAttributes = new NameValueCollection();

    // 从NameValueCollection集合中取纪录
    public string GetExtendedAttribute(string name)    
    {
        
    string returnValue = extendedAttributes[name];

        
    if (returnValue    == null)
        
    return string.Empty;
        
    else
        
    return returnValue;
    }


    // 设置扩展属性的在NameValueCollection中的键值和值
    public void SetExtendedAttribute(string    name, string value)    
    {
        extendedAttributes[name] 
    = value;
    }


    // 将extendedAttributes对象(前面定义的用来保存所有的用户扩展信息的NameValueCollection对象)序列化为内存流
    // 可以用来保存到数据库中
    public byte[] SerializeExtendedAttributes()    
    {

        
    // 序列化对象
        BinaryFormatter    binaryFormatter    = new BinaryFormatter();

        
    // 创建一个内存流,序列化后保存在其中
        MemoryStream ms    = new MemoryStream();
        
    byte[] b;

        
    // 将extendedAttributes对象(里面保存了所有的用户扩展信息)序列化为内存流
        
    //
        binaryFormatter.Serialize(ms, extendedAttributes);

        
    // 设置内存流的起始位置
        
    //
        ms.Position    = 0;
            
        
    // 读入到 byte 数组
        
    //
        b =    new    Byte[ms.Length];
        ms.Read(b, 
    0, b.Length);
        ms.Close();

        
    return b;
    }


    // 反序列化extendedAttributes对象的内容
    // 从数据库中读取出来的
    public void DeserializeExtendedAttributes(byte[] serializedExtendedAttributes) 
    {

        
    if (serializedExtendedAttributes.Length    == 0)
        
    return;
        
    try    
        
    {

        BinaryFormatter    binaryFormatter    
    = new BinaryFormatter();
        MemoryStream ms    
    = new MemoryStream();

        
    // 将 byte 数组到内存流
        
    //
        ms.Write(serializedExtendedAttributes, 0, serializedExtendedAttributes.Length);

        
    // 将内存流的位置到最开始位置
        
    //
        ms.Position    = 0;

        
    // 反序列化成NameValueCollection对象,创建出与原对象完全相同的副本
        
    //
        extendedAttributes = (NameValueCollection) binaryFormatter.Deserialize(ms);

        ms.Close();
        }
     
        
    catch    {}
        
    }

    实质上序列化机制是将类的值转化为一个一般的(即连续的)字节流,然后就可以将该流保存到数据库的某个字段中(在数据库中forums_UserProfile表中有一个字段“StringNameValues varbinary(7500)”)。读取的过程对对象进行反序列化时,创建出与原对象完全相同的副本。

  • 相关阅读:
    高级特性(4)- 数据库编程
    UVA Jin Ge Jin Qu hao 12563
    UVA 116 Unidirectional TSP
    HDU 2224 The shortest path
    poj 2677 Tour
    【算法学习】双调欧几里得旅行商问题(动态规划)
    南洋理工大学 ACM 在线评测系统 矩形嵌套
    UVA The Tower of Babylon
    uva A Spy in the Metro(洛谷 P2583 地铁间谍)
    洛谷 P1095 守望者的逃离
  • 原文地址:https://www.cnblogs.com/ruanbl/p/766650.html
Copyright © 2011-2022 走看看