zoukankan      html  css  js  c++  java
  • 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)”)。读取的过程对对象进行反序列化时,创建出与原对象完全相同的副本。

    注意一般这类属性在数据库中是不能被检索到的,并且要这些属性能被序列化。

  • 相关阅读:
    Arduino 各种模块篇 DHT11 温度湿度 数字模块 单总线
    Arduino 各种模块篇 火焰传感器
    exception
    google c++ code style
    昙花一现
    晏才宏
    win 2003 玩3D游戏设置
    生成多文件的Assembly 的两种方法
    怎样使自己写的程序集出现在Visual Studio Add Reference 的 .NET Tab页中
    安装将仅在管理模式下运行,安装终止
  • 原文地址:https://www.cnblogs.com/wzyexf/p/353512.html
Copyright © 2011-2022 走看看