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

asp.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源码

 

时间: 2024-08-30 16:02:28

Asp.Net Forums中对.Net中序列化和反序列化的应用的相关文章

PHP中SERIALIZE和JSON序列化与反序列化的区别

在PHP中,serialize和json两种方式对一个对象或数组进行序列化或反序列化有什么区别呢? 假设一个对象和一个数组: $web = new stdClass; $web->site = 'tantengvip'; $web->owner = 'tuntun'; $web->age = 5; 和 $web = array(); $web['site'] = 'tantengvip'; $web['owner'] = 'tuntun'; $web['age'] = 5; 对它们分别用

在MVC中使用Json.Net序列化和反序列化Json对象

在.Net的MVC开发中,经常会使用到Json对象,于是,系统提供了JsonResult这个对象,其本质是调用.Net系统自带的Json序列化类JavaScriptSerializer对数据对象进行序列化.但是这个系统自带的Json序列化对象方法没有Json.Net好用,于是打算有些时候用Json.Net替代默认的实现. 要实现有时候用Json.Net,有时候用默认实现,那么就要保证系统中两种实现并存.对于Server将对象序列化成Json传给Client很简单,我们只需要建立一个新的Actio

ASP.NET中JSON的序列化和反序列化

导读:JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍 ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间.集合.字典的处理. 一.JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是"名值对"的集合.结构由大括号'{

ASP.NET中JSON的序列化和反序列化使用说明_实用技巧

在网站应用中使用JSON的场景越来越多,本文介绍 ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间.集合.字典的处理. 一.JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是"名值对"的集合.结构由大括号'{}',中括号'[]',逗号',',冒号':',双引号'""'组成,包含

ASPNET中JSON的序列化和反序列化的方法_实用技巧

一.JSON简介  JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是"名值对"的集合.结构由大括号'{}',中括号'[]',逗号',',冒号':',双引号'""'组成,包含的数据类型有Object,Number,Boolean,String,Array, NULL等. JSON具有以下的形式: 对象(Object)是一个无序的"名值对"集合,一个对象以&quo

PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析_php技巧

本文实例讲述了PHP中SERIALIZE和JSON的序列化与反序列化操作区别.分享给大家供大家参考,具体如下: PHP中SERIALIZE和JSON序列化与反序列化区别是什么呢,对于这个问题我们可以和小编一起来看看,具体的操作细节如下所示. 在PHP中,serialize和json两种方式对一个对象或数组进行序列化或反序列化有什么区别呢? 假设一个对象和一个数组: $web = new stdClass; $web->site = 'tantengvip'; $web->owner = 'tu

详解Java中对象序列化与反序列化_java

        序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等.在网络传输过程中,可以是字节或是XML等格式.而字节的或XML编码格式可以还原完全相等的对象.这个相反的过程又称为反序列化.Java对象的序列化与反序列化 在Java中,我们可以通过多种方式来创建对象,并且只要对象没有被回收我们都可以复用该对象.但是,我们创建出来的这些Java对象都是存在于JVM的堆内存中的.只有JVM处于运行状态

Java序列化与反序列化

1.什么是序列化?为什么要序列化? Java 序列化就是指将对象转换为字节序列的过程,而反序列化则是只将字节序列转换成目标对象的过程. 我们都知道,在进行浏览器访问的时候,我们看到的文本.图片.音频.视频等都是通过二进制序列进行传输的,那么如果我们需要将Java对象进行传输的时候,是不是也应该先将对象进行序列化?答案是肯定的,我们需要先将Java对象进行序列化,然后通过网络,IO进行传输,当到达目的地之后,再进行反序列化获取到我们想要的对象,最后完成通信. 2.如何实现序列化 2.1.使用到JD

在ASP.NET FORUMS中一种存储和读取思路

asp.net 今天在ASP.NET FORUMS中发现了一种至少对于我来说特殊的存储思路,那就是通过BinaryFormatter将多个字段进行图像序列化,作为图像存储进数据库,然后通过转换成内存流再读出来,这种做法对于需要存储多个字段的时候,非常的方便.不用再写一长串的变量赋值.首先看一看,与管理设置页面相对应的一个实例类AspNetForums.Components.SiteSettings() 在SiteSettings()定义了Hashtable settings = new Hash