宝玉的blog

专注于web开发技术
随笔 - 78, 评论 - 1563, 引用 - 157

导航

关于


目前致力于ChinaCommunityServer的开发。

msn: junminliu(at)msn.com

标签

每月存档

最新留言

  • re:Openlab V2.0 Beta
    <p>宝玉你好: &nbsp; &nbsp; &nbsp; 我是个.net新手,最近看了openlab(openlab_V2.0_Beta)的源码。 ...
    by isforge(注册) on 2009/6/28 10:10:37
  • re:Openlab V2.0 Beta
    <p>宝玉你好: &nbsp; &nbsp; &nbsp; 我是个.net新手,最近看了openlab(openlab_V2.0_Beta)的源码。 ...
    by isforge(注册) on 2009/6/28 10:10:31
  • re:Openlab V2.0 Beta
    <p>宝玉你好: &nbsp; &nbsp; &nbsp; 我是个.net新手,最近看了openlab(openlab_V2.0_Beta)的源码。 ...
    by isforge(注册) on 2009/6/28 10:10:30
  • re:Openlab V2.0 Beta
    <p>宝玉你好: &nbsp; &nbsp; &nbsp; 我是个.net新手,最近看了openlab(openlab_V2.0_Beta)的源码。 ...
    by isforge(注册) on 2009/6/28 10:10:29
  • re:Openlab V2.0 Beta
    <p>宝玉你好: &nbsp; &nbsp; &nbsp; 我是个.net新手,最近看了openlab(openlab_V2.0_Beta)的源码。 ...
    by isforge(注册) on 2009/6/28 10:10:25
  • re:Openlab V2.0 Beta
    <p>宝玉你好: &nbsp; &nbsp; &nbsp; 我是个.net新手,最近看了openlab(openlab_V2.0_Beta)的源码。 ...
    by isforge(注册) on 2009/6/28 10:10:25
  • re:Openlab V2.0 Beta
    <p>宝玉你好: &nbsp; &nbsp; &nbsp; 我是个.net新手,最近看了openlab(openlab_V2.0_Beta)的源码。 ...
    by isforge(注册) on 2009/6/28 10:10:25
  • re:Openlab V2.0 Beta
    <p>宝玉你好: &nbsp; &nbsp; &nbsp; 我是个.net新手,最近看了openlab(openlab_V2.0_Beta)的源码。 ...
    by isforge(注册) on 2009/6/28 10:10:25
  • re:Silverlight中,防止ComboBox抢焦点
    在家”用网路”赚全世界的钱! 这是真正实现跨国事业最好的机制。藉由网路无远弗届的力量, 让全球超过180个国家变成一个单一市场,在你加入的那一刻, 网路能到达的地方,就是你收入能到达的地方。 ...
    by jackielongteng(注册) on 2009/6/14 13:19:48
  • re:Silverlight中,防止ComboBox抢焦点
    <p>我是初学者,您已经写了一个 组件上传的功能 。。我在2008下测试通过,,,但是弄2005测试的时候 发现 progress.aspx.cs页面的</p> <p&...
    by jxh12345j(注册) on 2009/4/7 8:55:12
  • ufnnutdh - Google Search
    ufnnutdh - Google Search
    by (匿名) on 2008/10/27 17:44:45
  • veysaync - Google Search
    veysaync - Google Search
    by (匿名) on 2008/10/5 5:20:49
  • mzgmhgio - Google Search
    mzgmhgio - Google Search
    by (匿名) on 2008/9/22 23:34:49
  • rhmhnyma - Google Search
    rhmhnyma - Google Search
    by (匿名) on 2008/9/22 7:48:44
  • re: 发布一个爱心小软件——网页抓图
    Maxthon应该有这个功能
    by passos(匿名) on 2008/7/21 20:05:23

广告

 

在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源码

打印 | 张贴于 2004-12-10 13:44:00 | Tag:CnForums

留言反馈

#回复: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
ado.net+access+.net framework 2.0 + windows 2003
解决无法查询的问题

"IIf(PropertyNames='' or PropertyNames is Null,'',Mid(PropertyValues,Val(Mid(Mid(PropertyNames,InStr(1,PropertyNames,'" + property.Name + "')+Len('" + property.Name + "')+3),1,InStr(1,Mid(PropertyNames,InStr(1,PropertyNames,'" + property.Name + "')+Len('" + property.Name + "')+3),':')-1))+1,4)) = '" + property.Value + "'"
2007-11-30 13:45:00 | [匿名用户:Robot.Crazy]
#回复: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
我也说一个解决方法,当然主要是为了回答上边所说的查询问题。
用另外一个基础表保本记录类型,如qq,msn,mail等。
然后在这个信息保存表中指定是qq还是msn就可以了。
这样如果要新加联系方式的话不需要改数据结构。
2007-10-05 09:25:00 | [匿名用户:xioxu]
#Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
Asp.NetForums中对.Net中序列化和反序列化的应用 在Forums中,有些内容是不固定的,例如用户资料,除了一些基本资料,可能还要有一些其他资料信息,例如MSN、个人主页、签名档等,...
2007-01-25 15:29:00 | [匿名用户:蓝狐]
#re: Asp.Net Forums 编辑
test
2006-11-19 22:08:00 | [匿名用户:test]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
请问你用来编辑代码的编辑器可以给出地址吗?
我在博客园上没有找到。
2006-02-16 09:56:00 | [匿名用户:徐子陵]
#序列化的几个应用(转载) 编辑
Microsoft.com
2006-01-24 09:27:00 | [匿名用户:木目]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
他妈的,太牛了。。
2005-11-07 16:33:00 | [匿名用户:genson]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
任何方法都有利弊。

这样做可以将一些非查询类资料进行序列化管理,将资料转换到一个字段内统一存储。类似于php当年的

内容=a|neirong=b|cic=C;

对不?
只是具体保存方法和保存的格式不同了。



学习。
2005-08-17 16:52:00 | [匿名用户:荣泽东]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
不能查询,这样不好吧。
2005-07-25 16:12:00 | [匿名用户:wang2855]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
ExtendedAttributes 表示序列化的属性,User类继承ExtendedAttributes 说明User类使用了序列化的属性。
实际上,CS中有很多属性都是保存在序列化中的,例如icqIM,你可以参考其实现。
2005-07-10 00:20:00 | [匿名用户:dotey]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
我想找到一个方便的途径来扩展membershipuser的属性。
我下载的cnform2.0并没有看到您所说的“
在communityserver中就是从membership继承了 ”
我看到的是: User : ExtendedAttributes
因为我是业余学习者,所以我一行行看其中的代码实在太累。
但大概明白其中的意思。虽然不是直接从membershipuser继承,但是的确用了membershipuser的属性。
就是不明白为什么不直接继承的了

我现在的思路如下,希望得到你的指正
1.建一个表(userattriextend),通过username字段来和aspnet_Users中的username建立联系
2.建个userattriextend类,不继承任何类。构造函数用一个userame参数,然后设置各种附加属性,如QQ,在属性设计中的set,get都是分别从数据库写入(update)和读取(executescalar).

希望继续得到你的帮助。
附:我明白把一个sql server的储存过程导出到access(access没有储存过程吧。).sql server数据库间的储存过程导入导出我目前是用attach-detach,或备份的方法,请问有什么更简单的方法吗?
我在你的asp.net发email的贴也问了个问题。

谢谢了。
2005-07-09 18:40:00 | [匿名用户:jaye]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
to jaye:
这个时候membership还没有出来呢,呵呵,在communityserver中就是从membership继承了
2005-07-09 13:01:00 | [匿名用户:dotey]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
我看过原代码原来是自己建一个user class.我把membershipuser和你说的user搞混了.
对不起,为什么不从membershipuser继承。
谢谢。
2005-07-08 21:23:00 | [匿名用户:jaye]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
大家好。我想增加user的属性,如加QQ,telephone.address,等属性,是不是要自己设计个类来继承user
例如我需要在用户资料里面增加QQ号这个属性,那么我只需要在User类中增加一个属性
public String QQIM
{
get { return GetExtendedAttribute("QQIM"); }
set { SetExtendedAttribute("QQIM", value); }
}
宝玉说的这句话什么意思,难道vs 2005可以直接修改user类的结构。

新手问题,请勿见笑
2005-07-08 17:57:00 | [匿名用户:jaye]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
怎样判断能不能能被序列化呢?
2005-05-27 16:01:00 | [匿名用户:xixi]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
谢谢指教
2005-05-21 15:28:00 | [匿名用户:kiko]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
to kiko:
必须是可转化为string型的,不需要被检索的,所以要灵活运行,不能全部采用
2005-04-23 01:47:00 | [匿名用户:宝玉]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
应该可以把User的所有属性都保存在nameValueCollection里存入一个字段里吧!请指教.
2005-04-21 15:41:00 | [匿名用户:kiko]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
SqlDataProvider写了三、四千行,不知这种集中的写法是好是坏?
2005-02-18 14:12:00 | [匿名用户:yoyo]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
准确来说,所有的数据库实现都在SqlDataProvider项目中实现的!
2005-02-17 01:56:00 | [匿名用户:宝玉]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
数据库读取在DataProvider中:)
2005-02-17 01:48:00 | [匿名用户:宝玉]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
请教一下,有一点没看懂,这里哪段代码是表示从数据库读出数据的啊?
2005-02-16 16:49:00 | [匿名用户:菜鸟]
#Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
Ping Back来自:blog.csdn.net
2005-01-12 10:14:00 | [匿名用户:缎雨]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
应该不会的,因为Forums就是用的这种序列化方法,如果有这种情况,那么就会出现用户资料无法读取的情况了!

建议再检查一下您的代码!
2004-12-27 10:51:00 | [匿名用户:宝玉]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
比较郁闷,在A机器上,使用此方法保存的BYTE[]文件进VARBINAry字段.读取和写入正常.

因为办公室的代码要拿 回家写,备份恢复SQL库后,此字段读取失败.长度稍发生变化.

SQL同样的版本.
2004-12-26 16:38:00 | [匿名用户:dazhou]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
自动;格式化,有点小明白
2004-12-18 15:26:00 | [匿名用户:aminic]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
呵呵。。俺笨啦。
2004-12-18 15:04:00 | [匿名用户:aminic]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
原因是不需要查询?内容不因定?
2004-12-18 15:03:00 | [匿名用户:aminic]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
好处在一开始就有说啦。
对于字符串序列化方式在另一篇随笔中有说明!
:)
2004-12-17 20:10:00 | [匿名用户:宝玉]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
俺不是很明白,序列化后存储有什么好处呢?
俺想着如果按到一定的格式把这些信息连接成字符串存储在一个字段里面不好么?
按格式的话也可以查询
2004-12-17 18:54:00 | [匿名用户:aminic]
#当用户资料的条目增多时…… 编辑
Ping Back来自:blog.csdn.net
2004-12-16 22:51:00 | [匿名用户:blueoxygen]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
请问您是用什么工具将源代码的格式保留的这么好?谢谢
2004-12-12 21:41:00 | [匿名用户:Eric]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
不太喜欢这样应用
需求是客户提出的,如果事后客户再提出搜索个人主页,QQ号,签名档等,我想改起来更麻烦
2004-12-11 20:07:00 | [匿名用户:lion]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
关于序列化,我想说的是

正面:减少程序员开发量,提高灵活性,Flexible
反面:一个字,慢

但是至少这个地方用此方法很好。
2004-12-10 20:10:00 | [匿名用户:yashika]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
那为什么不用XML序列化呢?XML序列化后还能做简单的查询。
2004-12-10 19:17:00 | [匿名用户:wingfeng]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
这个方法太好了,我正好需要
2004-12-10 18:00:00 | [匿名用户:exee]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
sql不支持这样的查询吧?!
2004-12-10 16:47:00 | [匿名用户:宝玉]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
把查询字符串也先序列化,然后再到数据库里面去查询,如何?
2004-12-10 16:22:00 | [匿名用户:ahnan]
#re: Asp.Net Forums中对.Net中序列化和反序列化的应用 编辑
不能查询:(
所以主要用来保存一些不需要被查询的,例如个人主页,QQ号,签名档等
2004-12-10 14:06:00 | [匿名用户:宝玉]
#but how to Query? 编辑
but how to Query?
2004-12-10 13:56:00 | [匿名用户:playyuer]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.1.0