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

简介:
原文: http://blog.joycode.com/dotey/archive/2004/12/10/40887.aspx

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

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

更详细内容请查阅MSDN和Asp.Net Forums源码


本文转自浪子博客园博客,原文链接:http://www.cnblogs.com/walkingboy/archive/2005/04/14/137749.html,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
开发框架 前端开发 .NET
VB.NET中如何利用ASP.NET进行Web开发
在VB.NET中利用ASP.NET进行Web开发是一个常见的做法,特别是在需要构建动态、交互式Web应用程序时。ASP.NET是一个由微软开发的开源Web应用程序框架,它允许开发者使用多种编程语言(包括VB.NET)来创建Web应用程序。
59 5
|
3月前
|
开发框架 JSON .NET
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
|
3月前
|
开发框架 .NET 开发工具
【Azure 应用服务】App Service 的.NET Version选择为.NET6,是否可以同时支持运行ASP.NET V4.8的应用呢?
【Azure 应用服务】App Service 的.NET Version选择为.NET6,是否可以同时支持运行ASP.NET V4.8的应用呢?
|
3月前
|
开发框架 监控 .NET
【Azure 应用程序见解】在Docker中运行的ASP.NET Core应用如何开启Application Insights的Profiler Trace呢?
【Azure 应用程序见解】在Docker中运行的ASP.NET Core应用如何开启Application Insights的Profiler Trace呢?
|
3月前
|
开发框架 .NET API
如何在 ASP.NET Core Web Api 项目中应用 NLog 写日志?
如何在 ASP.NET Core Web Api 项目中应用 NLog 写日志?
183 0
|
3月前
|
开发框架 .NET 数据库连接
ASP.NET Core 标识(Identity)框架系列(一):如何使用 ASP.NET Core 标识(Identity)框架创建用户和角色?
ASP.NET Core 标识(Identity)框架系列(一):如何使用 ASP.NET Core 标识(Identity)框架创建用户和角色?
|
前端开发 NoSQL .NET
一起谈.NET技术,重构TekPub——从ASP.NET MVC框架迁移到Ruby on Rails
  TekPub是一个面向开发人员的站点,致力于为开发人员提供一系列主题的在线培训,主题范围非常广泛,从微软的O/R Mapping框架Microsoft Entity Framework,到如何使用Ruby on Rails技术编写自己的日志引擎等内容都有涉及。
1637 0
|
Web App开发 SQL 前端开发
一起谈.NET技术,鲜为人知的ASP.NET MVC 2.0框架高效之谜
  要想建立开发环境,你需要安装Visual Studio 2008/2010 Beta 2,以及SQL Express 2005(可免费从MSDN下载)和MVC 2.0框架。我把本文中的示例Web应用命名为“Employee Master Information”。
1012 0
|
存储 缓存 .NET
一起谈.NET技术,提高ASP.NET应用程序性能的十大方法
  一、返回多个数据集   检查你的访问数据库的代码,看是否存在着要返回多次的请求。每次往返降低了你的应用程序的每秒能够响应请求的次数。通过在单个数据库请求中返回多个结果集,可以减少与数据库通信的时间,使你的系统具有扩展性,也可以减少数据库服务器响应请求的工作量。
1228 0
|
Web App开发 .NET 数据库
一起谈.NET技术,ASP.NET中如何正确使用Session
  Asp.Net中的Session要比Asp中的Session灵活和强大很多,同时也复杂很多;看到有一些Asp.Net开发人员报怨说Session不稳定,莫名其妙的丢失,其实这正是Asp.Net改进的地方之一。
1033 0
下一篇
无影云桌面