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,如需转载请自行联系原作者
目录
相关文章
|
6月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
326 1
|
6月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
326 1
|
10月前
|
存储 Java 编译器
说一说关于序列化/反序列化中的细节问题
我是小假 期待与你的下一次相遇 ~
199 1
|
10月前
|
JSON Java 数据库连接
|
11月前
|
存储 安全 IDE
说一说序列化与反序列化中存在的问题
本文详细解析了Java中的序列化机制,包括序列化的概念、实现方式及应用场景。通过Student类的实例演示了对象的序列化与反序列化过程,并分析了`Serializable`接口的作用以及`serialVersionUID`的重要意义。此外,文章还探讨了如何通过自定义`readObject()`方法增强序列化的安全性,以及解决可序列化单例模式中可能产生的多实例问题。最后提供了代码示例和运行结果,帮助读者深入理解序列化的原理与实践技巧。
278 3
|
11月前
|
JSON JavaScript 前端开发
Go语言JSON 序列化与反序列化 -《Go语言实战指南》
本文介绍了 Go 语言中使用 `encoding/json` 包实现 JSON 与数据结构之间的转换。内容涵盖序列化(`Marshal`)和反序列化(`Unmarshal`),包括基本示例、结构体字段标签的使用、控制字段行为的标签(如 `omitempty` 和 `-`)、处理 `map` 和切片、嵌套结构体序列化、反序列化未知结构(使用 `map[string]interface{}`)以及 JSON 数组的解析。最后通过表格总结了序列化与反序列化的方法及类型要求,帮助开发者快速掌握 JSON 数据处理技巧。
|
C# Android开发 iOS开发
2025年全面的.NET跨平台应用框架推荐
2025年全面的.NET跨平台应用框架推荐
729 23
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
362 5
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
740 1