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); }
}
不需要修改数据库表结构,不需要修改存储过程,连数据库访问的程序都不需要动。

其具体实现的主要代码:

None.gif //  首先新建在User类中新建一个NameValueCollection对象,将这些扩展属性都保存在NameValueCollection对象中
None.gif
NameValueCollection extendedAttributes =  new NameValueCollection();
None.gif
None.gif //  从NameValueCollection集合中取纪录
None.gif
public  string GetExtendedAttribute( string name)    
ExpandedBlockStart.gif ContractedBlock.gif dot.gif {
InBlock.gif    string returnValue = extendedAttributes[name];
InBlock.gif
InBlock.gif    if (returnValue    == null)
InBlock.gif    return string.Empty;
InBlock.gif    else
InBlock.gif    return returnValue;
ExpandedBlockEnd.gif}

None.gif
None.gif //  设置扩展属性的在NameValueCollection中的键值和值
None.gif
public  void SetExtendedAttribute( string    name,  string value)    
ExpandedBlockStart.gif ContractedBlock.gif dot.gif {
InBlock.gif    extendedAttributes[name] = value;
ExpandedBlockEnd.gif}

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

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

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

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

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


本文转自浪子博客园博客,原文链接:http://www.cnblogs.com/walkingboy/archive/2005/04/14/137749.html,如需转载请自行联系原作者
目录
相关文章
|
4天前
|
开发框架 JSON .NET
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
|
26天前
|
开发框架 搜索推荐 前端开发
【.NET全栈】ASP.NET开发Web应用——Web部件技术
【.NET全栈】ASP.NET开发Web应用——Web部件技术
|
4天前
|
开发框架 .NET API
如何在 ASP.NET Core Web Api 项目中应用 NLog 写日志?
如何在 ASP.NET Core Web Api 项目中应用 NLog 写日志?
|
4天前
|
开发框架 .NET 数据库连接
ASP.NET Core 标识(Identity)框架系列(一):如何使用 ASP.NET Core 标识(Identity)框架创建用户和角色?
ASP.NET Core 标识(Identity)框架系列(一):如何使用 ASP.NET Core 标识(Identity)框架创建用户和角色?
|
2月前
|
开发框架 前端开发 .NET
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
集成于VS 2019,EXT.NET前端和ASP.NET后端,搭配MSSQL 2018数据库。系统覆盖样品管理、数据分析、报表和项目管理等实验室全流程。应用广泛,包括生产质检(如石化、制药)、环保监测、试验研究等领域。随着技术发展,现代LIMS还融合了临床、电子实验室笔记本和SaaS等功能,以满足复杂多样的实验室管理需求。
49 3
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
|
2月前
|
Linux C# C++
【.NET Developer】创建ASP.NET Core Blazor项目并打包为Linux镜像发布到Azure应用服务
本文介绍了如何使用VS2019和.NET框架创建一个Blazor应用,并将其部署到Azure应用服务。首先,Blazor是一个使用C#而非JavaScript构建交互式Web UI的框架,支持共享服务器和客户端应用逻辑,以及与Docker和Azure集成。任务包括创建Blazor项目,配置Dockerfile为Linux容器,本地测试,发布到Azure Container Registry (ACR),然后在Azure App Service for Container上部署。在部署过程中,需确保Docker设置正确,开启ACR的Admin访问权限,并监控镜像拉取和容器启动日志。
|
16天前
|
存储 开发框架 .NET
解锁SqlSugar新境界:利用Serialize.Linq实现Lambda表达式灵活序列化与反序列化,赋能动态数据查询新高度!
【8月更文挑战第3天】随着软件开发复杂度提升,数据查询的灵活性变得至关重要。SqlSugar作为一款轻量级、高性能的.NET ORM框架,简化了数据库操作。但在需要跨服务共享查询逻辑时,直接传递Lambda表达式不可行。这时,Serialize.Linq库大显身手,能将Linq表达式序列化为字符串,实现在不同服务间传输查询逻辑。结合使用SqlSugar和Serialize.Linq,不仅能够保持代码清晰,还能实现复杂的动态查询逻辑,极大地增强了应用程序的灵活性和可扩展性。
39 2
|
13天前
|
存储 算法 Python
【Leetcode刷题Python】297. 二叉树的序列化与反序列化
LeetCode第297题"二叉树的序列化与反序列化"的Python语言解决方案,包括序列化二叉树为字符串和反序列化字符串为二叉树的算法实现。
15 5
|
18天前
|
开发框架 缓存 前端开发
基于SqlSugar的开发框架循序渐进介绍(24)-- 使用Serialize.Linq对Lambda表达式进行序列化和反序列化
基于SqlSugar的开发框架循序渐进介绍(24)-- 使用Serialize.Linq对Lambda表达式进行序列化和反序列化
|
3天前
|
JSON 缓存 安全
Python pickle 二进制序列化和反序列化 - 数据持久化
Python pickle 二进制序列化和反序列化 - 数据持久化
9 0