Asp.Net Forums中对.Net中序列化和反序列化的应用
原文:http://blog.joycode.com/dotey/archive/2004/12/10/40887.aspx 
 // 首先新建在User类中新建一个NameValueCollection对象,将这些扩展属性都保存在NameValueCollection对象中
// 首先新建在User类中新建一个NameValueCollection对象,将这些扩展属性都保存在NameValueCollection对象中 
 NameValueCollection extendedAttributes = new NameValueCollection();
NameValueCollection extendedAttributes = new NameValueCollection(); 
 
 
 // 从NameValueCollection集合中取纪录
// 从NameValueCollection集合中取纪录 
 public string GetExtendedAttribute(string name)
public string GetExtendedAttribute(string name)     
 {
{ 
 string returnValue = extendedAttributes[name];
    string returnValue = extendedAttributes[name]; 
 
 
 if (returnValue    == null)
    if (returnValue    == null) 
 return string.Empty;
    return string.Empty; 
 else
    else 
 return returnValue;
    return returnValue; 
 }
} 
 
 
 // 设置扩展属性的在NameValueCollection中的键值和值
// 设置扩展属性的在NameValueCollection中的键值和值 
 public void SetExtendedAttribute(string    name, string value)
public void SetExtendedAttribute(string    name, string value)     
 {
{ 
 extendedAttributes[name] = value;
    extendedAttributes[name] = value; 
 }
} 
 
 
 // 将extendedAttributes对象(前面定义的用来保存所有的用户扩展信息的NameValueCollection对象)序列化为内存流
// 将extendedAttributes对象(前面定义的用来保存所有的用户扩展信息的NameValueCollection对象)序列化为内存流 
 // 可以用来保存到数据库中
// 可以用来保存到数据库中 
 public byte[] SerializeExtendedAttributes()
public byte[] SerializeExtendedAttributes()     
 {
{ 
 
 
 // 序列化对象
    // 序列化对象 
 BinaryFormatter    binaryFormatter    = new BinaryFormatter();
    BinaryFormatter    binaryFormatter    = new BinaryFormatter(); 
 
 
 // 创建一个内存流,序列化后保存在其中
    // 创建一个内存流,序列化后保存在其中 
 MemoryStream ms    = new MemoryStream();
    MemoryStream ms    = new MemoryStream(); 
 byte[] b;
    byte[] b; 
 
 
 // 将extendedAttributes对象(里面保存了所有的用户扩展信息)序列化为内存流
    // 将extendedAttributes对象(里面保存了所有的用户扩展信息)序列化为内存流 
 //
    // 
 binaryFormatter.Serialize(ms, extendedAttributes);
    binaryFormatter.Serialize(ms, extendedAttributes); 
 
 
 // 设置内存流的起始位置
    // 设置内存流的起始位置 
 //
    // 
 ms.Position    = 0;
    ms.Position    = 0; 
 
         
 // 读入到 byte 数组
    // 读入到 byte 数组 
 //
    // 
 b =    new    Byte[ms.Length];
    b =    new    Byte[ms.Length]; 
 ms.Read(b, 0, b.Length);
    ms.Read(b, 0, b.Length); 
 ms.Close();
    ms.Close(); 
 
 
 return b;
    return b; 
 }
} 
 
 
 // 反序列化extendedAttributes对象的内容
// 反序列化extendedAttributes对象的内容 
 // 从数据库中读取出来的
// 从数据库中读取出来的 
 public void DeserializeExtendedAttributes(byte[] serializedExtendedAttributes)
public void DeserializeExtendedAttributes(byte[] serializedExtendedAttributes)  
 {
{ 
 
 
 if (serializedExtendedAttributes.Length    == 0)
    if (serializedExtendedAttributes.Length    == 0) 
 return;
    return; 
 try
    try     
 {
    { 
 
 
 BinaryFormatter    binaryFormatter    = new BinaryFormatter();
    BinaryFormatter    binaryFormatter    = new BinaryFormatter(); 
 MemoryStream ms    = new MemoryStream();
    MemoryStream ms    = new MemoryStream(); 
 
 
 // 将 byte 数组到内存流
    // 将 byte 数组到内存流 
 //
    // 
 ms.Write(serializedExtendedAttributes, 0, serializedExtendedAttributes.Length);
    ms.Write(serializedExtendedAttributes, 0, serializedExtendedAttributes.Length); 
 
 
 // 将内存流的位置到最开始位置
    // 将内存流的位置到最开始位置 
 //
    // 
 ms.Position    = 0;
    ms.Position    = 0; 
 
 
 // 反序列化成NameValueCollection对象,创建出与原对象完全相同的副本
    // 反序列化成NameValueCollection对象,创建出与原对象完全相同的副本 
 //
    // 
 extendedAttributes = (NameValueCollection) binaryFormatter.Deserialize(ms);
    extendedAttributes = (NameValueCollection) binaryFormatter.Deserialize(ms); 
 
 
 ms.Close();
    ms.Close(); 
 }
    }  
 catch    {}
    catch    {} 
 
     
 }
} 
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对象中
// 首先新建在User类中新建一个NameValueCollection对象,将这些扩展属性都保存在NameValueCollection对象中  NameValueCollection extendedAttributes = new NameValueCollection();
NameValueCollection extendedAttributes = new NameValueCollection();  
  // 从NameValueCollection集合中取纪录
// 从NameValueCollection集合中取纪录  public string GetExtendedAttribute(string name)
public string GetExtendedAttribute(string name)      {
{  string returnValue = extendedAttributes[name];
    string returnValue = extendedAttributes[name];  
  if (returnValue    == null)
    if (returnValue    == null)  return string.Empty;
    return string.Empty;  else
    else  return returnValue;
    return returnValue;  }
}  
  // 设置扩展属性的在NameValueCollection中的键值和值
// 设置扩展属性的在NameValueCollection中的键值和值  public void SetExtendedAttribute(string    name, string value)
public void SetExtendedAttribute(string    name, string value)      {
{  extendedAttributes[name] = value;
    extendedAttributes[name] = value;  }
}  
  // 将extendedAttributes对象(前面定义的用来保存所有的用户扩展信息的NameValueCollection对象)序列化为内存流
// 将extendedAttributes对象(前面定义的用来保存所有的用户扩展信息的NameValueCollection对象)序列化为内存流  // 可以用来保存到数据库中
// 可以用来保存到数据库中  public byte[] SerializeExtendedAttributes()
public byte[] SerializeExtendedAttributes()      {
{  
  // 序列化对象
    // 序列化对象  BinaryFormatter    binaryFormatter    = new BinaryFormatter();
    BinaryFormatter    binaryFormatter    = new BinaryFormatter();  
  // 创建一个内存流,序列化后保存在其中
    // 创建一个内存流,序列化后保存在其中  MemoryStream ms    = new MemoryStream();
    MemoryStream ms    = new MemoryStream();  byte[] b;
    byte[] b;  
  // 将extendedAttributes对象(里面保存了所有的用户扩展信息)序列化为内存流
    // 将extendedAttributes对象(里面保存了所有的用户扩展信息)序列化为内存流  //
    //  binaryFormatter.Serialize(ms, extendedAttributes);
    binaryFormatter.Serialize(ms, extendedAttributes);  
  // 设置内存流的起始位置
    // 设置内存流的起始位置  //
    //  ms.Position    = 0;
    ms.Position    = 0;  
          // 读入到 byte 数组
    // 读入到 byte 数组  //
    //  b =    new    Byte[ms.Length];
    b =    new    Byte[ms.Length];  ms.Read(b, 0, b.Length);
    ms.Read(b, 0, b.Length);  ms.Close();
    ms.Close();  
  return b;
    return b;  }
}  
  // 反序列化extendedAttributes对象的内容
// 反序列化extendedAttributes对象的内容  // 从数据库中读取出来的
// 从数据库中读取出来的  public void DeserializeExtendedAttributes(byte[] serializedExtendedAttributes)
public void DeserializeExtendedAttributes(byte[] serializedExtendedAttributes)   {
{  
  if (serializedExtendedAttributes.Length    == 0)
    if (serializedExtendedAttributes.Length    == 0)  return;
    return;  try
    try      {
    {  
  BinaryFormatter    binaryFormatter    = new BinaryFormatter();
    BinaryFormatter    binaryFormatter    = new BinaryFormatter();  MemoryStream ms    = new MemoryStream();
    MemoryStream ms    = new MemoryStream();  
  // 将 byte 数组到内存流
    // 将 byte 数组到内存流  //
    //  ms.Write(serializedExtendedAttributes, 0, serializedExtendedAttributes.Length);
    ms.Write(serializedExtendedAttributes, 0, serializedExtendedAttributes.Length);  
  // 将内存流的位置到最开始位置
    // 将内存流的位置到最开始位置  //
    //  ms.Position    = 0;
    ms.Position    = 0;  
  // 反序列化成NameValueCollection对象,创建出与原对象完全相同的副本
    // 反序列化成NameValueCollection对象,创建出与原对象完全相同的副本  //
    //  extendedAttributes = (NameValueCollection) binaryFormatter.Deserialize(ms);
    extendedAttributes = (NameValueCollection) binaryFormatter.Deserialize(ms);  
  ms.Close();
    ms.Close();  }
    }   catch    {}
    catch    {}  
      }
} 实质上序列化机制是将类的值转化为一个一般的(即连续的)字节流,然后就可以将该流保存到数据库的某个字段中(在数据库中forums_UserProfile表中有一个字段“StringNameValues varbinary(7500)”)。读取的过程对对象进行反序列化时,创建出与原对象完全相同的副本。
注意一般这类属性在数据库中是不能被检索到的,并且要这些属性能被序列化。
更详细内容请查阅MSDN和Asp.Net Forums源码
 
                    
                


 
     
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号