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

  http://topic.csdn.net/u/20080624/12/78e85273-149e-4b43-80cf-6dad3cdec54b.html

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

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

其具体实现的主要代码:

Asp.Net Forums中对.Net中序列化和反序列化的应用 //  首先新建在User类中新建一个NameValueCollection对象,将这些扩展属性都保存在NameValueCollection对象中
Asp.Net Forums中对.Net中序列化和反序列化的应用
NameValueCollection extendedAttributes  =   new  NameValueCollection();
Asp.Net Forums中对.Net中序列化和反序列化的应用
Asp.Net Forums中对.Net中序列化和反序列化的应用
//  从NameValueCollection集合中取纪录
Asp.Net Forums中对.Net中序列化和反序列化的应用
public   string  GetExtendedAttribute( string  name)    
Asp.Net Forums中对.Net中序列化和反序列化的应用
{
Asp.Net Forums中对.Net中序列化和反序列化的应用    
string returnValue = extendedAttributes[name];
Asp.Net Forums中对.Net中序列化和反序列化的应用
Asp.Net Forums中对.Net中序列化和反序列化的应用    
if (returnValue    == null)
Asp.Net Forums中对.Net中序列化和反序列化的应用    
return string.Empty;
Asp.Net Forums中对.Net中序列化和反序列化的应用    
else
Asp.Net Forums中对.Net中序列化和反序列化的应用    
return returnValue;
Asp.Net Forums中对.Net中序列化和反序列化的应用}

Asp.Net Forums中对.Net中序列化和反序列化的应用
Asp.Net Forums中对.Net中序列化和反序列化的应用
//  设置扩展属性的在NameValueCollection中的键值和值
Asp.Net Forums中对.Net中序列化和反序列化的应用
public   void  SetExtendedAttribute( string     name,  string  value)    
Asp.Net Forums中对.Net中序列化和反序列化的应用
{
Asp.Net Forums中对.Net中序列化和反序列化的应用    extendedAttributes[name] 
= value;
Asp.Net Forums中对.Net中序列化和反序列化的应用}

Asp.Net Forums中对.Net中序列化和反序列化的应用
Asp.Net Forums中对.Net中序列化和反序列化的应用
//  将extendedAttributes对象(前面定义的用来保存所有的用户扩展信息的NameValueCollection对象)序列化为内存流
Asp.Net Forums中对.Net中序列化和反序列化的应用
//  可以用来保存到数据库中
Asp.Net Forums中对.Net中序列化和反序列化的应用
public   byte [] SerializeExtendedAttributes()    
Asp.Net Forums中对.Net中序列化和反序列化的应用
{
Asp.Net Forums中对.Net中序列化和反序列化的应用
Asp.Net Forums中对.Net中序列化和反序列化的应用    
// 序列化对象
Asp.Net Forums中对.Net中序列化和反序列化的应用
    BinaryFormatter    binaryFormatter    = new BinaryFormatter();
Asp.Net Forums中对.Net中序列化和反序列化的应用
Asp.Net Forums中对.Net中序列化和反序列化的应用    
// 创建一个内存流,序列化后保存在其中
Asp.Net Forums中对.Net中序列化和反序列化的应用
    MemoryStream ms    = new MemoryStream();
Asp.Net Forums中对.Net中序列化和反序列化的应用    
byte[] b;
Asp.Net Forums中对.Net中序列化和反序列化的应用
Asp.Net Forums中对.Net中序列化和反序列化的应用    
// 将extendedAttributes对象(里面保存了所有的用户扩展信息)序列化为内存流
Asp.Net Forums中对.Net中序列化和反序列化的应用    
//
Asp.Net Forums中对.Net中序列化和反序列化的应用
    binaryFormatter.Serialize(ms, extendedAttributes);
Asp.Net Forums中对.Net中序列化和反序列化的应用
Asp.Net Forums中对.Net中序列化和反序列化的应用    
// 设置内存流的起始位置
Asp.Net Forums中对.Net中序列化和反序列化的应用    
//
Asp.Net Forums中对.Net中序列化和反序列化的应用
    ms.Position    = 0;
Asp.Net Forums中对.Net中序列化和反序列化的应用        
Asp.Net Forums中对.Net中序列化和反序列化的应用    
// 读入到 byte 数组
Asp.Net Forums中对.Net中序列化和反序列化的应用    
//
Asp.Net Forums中对.Net中序列化和反序列化的应用
    b =    new    Byte[ms.Length];
Asp.Net Forums中对.Net中序列化和反序列化的应用    ms.Read(b, 
0, b.Length);
Asp.Net Forums中对.Net中序列化和反序列化的应用    ms.Close();
Asp.Net Forums中对.Net中序列化和反序列化的应用
Asp.Net Forums中对.Net中序列化和反序列化的应用    
return b;
Asp.Net Forums中对.Net中序列化和反序列化的应用}

Asp.Net Forums中对.Net中序列化和反序列化的应用
Asp.Net Forums中对.Net中序列化和反序列化的应用
//  反序列化extendedAttributes对象的内容
Asp.Net Forums中对.Net中序列化和反序列化的应用
//  从数据库中读取出来的
Asp.Net Forums中对.Net中序列化和反序列化的应用
public   void  DeserializeExtendedAttributes( byte [] serializedExtendedAttributes) 
Asp.Net Forums中对.Net中序列化和反序列化的应用
{
Asp.Net Forums中对.Net中序列化和反序列化的应用
Asp.Net Forums中对.Net中序列化和反序列化的应用    
if (serializedExtendedAttributes.Length    == 0)
Asp.Net Forums中对.Net中序列化和反序列化的应用    
return;
Asp.Net Forums中对.Net中序列化和反序列化的应用    
try    
Asp.Net Forums中对.Net中序列化和反序列化的应用    
{
Asp.Net Forums中对.Net中序列化和反序列化的应用
Asp.Net Forums中对.Net中序列化和反序列化的应用    BinaryFormatter    binaryFormatter    
= new BinaryFormatter();
Asp.Net Forums中对.Net中序列化和反序列化的应用    MemoryStream ms    
= new MemoryStream();
Asp.Net Forums中对.Net中序列化和反序列化的应用
Asp.Net Forums中对.Net中序列化和反序列化的应用    
// 将 byte 数组到内存流
Asp.Net Forums中对.Net中序列化和反序列化的应用    
//
Asp.Net Forums中对.Net中序列化和反序列化的应用
    ms.Write(serializedExtendedAttributes, 0, serializedExtendedAttributes.Length);
Asp.Net Forums中对.Net中序列化和反序列化的应用
Asp.Net Forums中对.Net中序列化和反序列化的应用    
// 将内存流的位置到最开始位置
Asp.Net Forums中对.Net中序列化和反序列化的应用    
//
Asp.Net Forums中对.Net中序列化和反序列化的应用
    ms.Position    = 0;
Asp.Net Forums中对.Net中序列化和反序列化的应用
Asp.Net Forums中对.Net中序列化和反序列化的应用    
// 反序列化成NameValueCollection对象,创建出与原对象完全相同的副本
Asp.Net Forums中对.Net中序列化和反序列化的应用    
//
Asp.Net Forums中对.Net中序列化和反序列化的应用
    extendedAttributes = (NameValueCollection) binaryFormatter.Deserialize(ms);
Asp.Net Forums中对.Net中序列化和反序列化的应用
Asp.Net Forums中对.Net中序列化和反序列化的应用    ms.Close();
Asp.Net Forums中对.Net中序列化和反序列化的应用    }
 
Asp.Net Forums中对.Net中序列化和反序列化的应用    
catch    {}
Asp.Net Forums中对.Net中序列化和反序列化的应用    
Asp.Net Forums中对.Net中序列化和反序列化的应用}

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

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

你可能感兴趣的:(asp.net)