首页 > 编程 > .NET > 正文

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

2024-07-10 13:06:58
字体:
来源:转载
供稿:网友

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

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

更详细内容请查阅msdn和asp.net forums源码

 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表