Discuz!NT之配置文件类[discuz.config]

来源:互联网 发布:化学仿真实验软件 编辑:程序博客网 时间:2024/05/01 14:49

    如果大家从官方下载2.0正式版的DLL程序集中会从里面找到discuz.config这个DLL文件。通过
reflector 反射加载这个程序集后,后从中找到一些从类名称上非常相似且有一定规律(格式)的类。
它们是:

    全局配置类
    GeneralConfigFileManager.cs
    GeneralConfigInfo.cs
    GeneralConfigs.cs

    Emial配置类
    EmailConfigFileManager.cs
    EmailConfigInfo.cs
    EmailConfigs.cs

    基本配置类
    BaseConfigFileManager.cs
    BaseConfigInfo.cs
    BaseConfigInfoCollection.cs
    BaseConfigs.cs

    相册配置类
    AlbumConfigFileManager.cs
    AlbumConfigInfo.cs
    AlbumConfigs.cs

    聚合配置类
    AggregationConfig.cs
    AggregationConfigFileManager.cs
    AggregationConfigInfo.cs

    空间开通配置类
    SpaceActiveConfigs.cs
    SpaceActiveConfigFileManager.cs
    SpaceActiveConfigInfo.cs.cs

    可以看到,这些类基本上是以三个一组,共六组。而这六组类中的...FileManager.cs与Defau-
ltConfigFileManager.cs的关系如下图所示:

   


      从类图上看,DefaultConfigFileManager.cs是基类,而GeneralConfigFileManager.cs,Emai-
lConfigFileManager.cs,BaseConfigFileManager.cs,AlbumConfigFileManager.cs,Aggregatio-
nConfigFileManager.cs, SpaceActiveConfigFileManager.cs分别派生自DefaultConfigFileManager。
而DefaultConfigFileManager本身也定义了几个属性和方法以便于子类调用或重写(如SaveConfig)。
而DefaultConfigFileManager的定义如下:

  

  1 /**//// <summary>
  2    /// 文件配置管理基类
  3    /// </summary>
  4    public class DefaultConfigFileManager
  5    {
  6        /**//// <summary>
  7        /// 文件所在路径变量
  8        /// </summary>
  9        private static string m_configfilepath;
 10
 11        /**//// <summary>
 12        /// 临时配置对象变量
 13        /// </summary>
 14        private static IConfigInfo m_configinfo = null;
 15
 16        /**//// <summary>
 17        /// 锁对象
 18        /// </summary>
 19        private static object m_lockHelper = new object();
 20       
 21
 22        /**//// <summary>
 23        /// 文件所在路径
 24        /// </summary>
 25        public static string ConfigFilePath
 26        {
 27            get { return m_configfilepath; }
 28            set { m_configfilepath = value; }
 29        }
 30
 31      
 32        /**//// <summary>
 33        /// 临时配置对象
 34        /// </summary>
 35        public static IConfigInfo ConfigInfo
 36        {
 37            get { return m_configinfo; }
 38            set { m_configinfo = value; }
 39        }
 40            
 41        /**//// <summary>
 42        /// 加载(反序列化)指定对象类型的配置对象
 43        /// </summary>
 44        /// <param name="fileoldchange">文件加载时间</param>
 45        /// <param name="configFilePath">配置文件所在路径</param>
 46        /// <param name="configinfo">相应的变量 注:该参数主要用于设置m_configinfo变量和获取类型.GetType()</param>
 47        /// <returns></returns>
 48        protected static IConfigInfo LoadConfig(ref DateTime fileoldchange, string configFilePath, IConfigInfo configinfo)
 49        {
 50            return LoadConfig(ref fileoldchange, configFilePath, configinfo, true);
 51        }
 52
 53
 54        /**//// <summary>
 55        /// 加载(反序列化)指定对象类型的配置对象
 56        /// </summary>
 57        /// <param name="fileoldchange">文件加载时间</param>
 58        /// <param name="configFilePath">配置文件所在路径(包括文件名)</param>
 59        /// <param name="configinfo">相应的变量 注:该参数主要用于设置m_configinfo变量 和 获取类型.GetType()</param>
 60        /// <param name="checkTime">是否检查并更新传递进来的"文件加载时间"变量</param>
 61        /// <returns></returns>
 62        protected static IConfigInfo LoadConfig(ref DateTime fileoldchange, string configFilePath, IConfigInfo configinfo, bool checkTime)
 63        {
 64            m_configfilepath = configFilePath;
 65            m_configinfo = configinfo;
 66
 67            if (checkTime)
 68            {
 69                DateTime m_filenewchange = System.IO.File.GetLastWriteTime(configFilePath);
 70
 71                //当程序运行中config文件发生变化时则对config重新赋值
 72                if (fileoldchange != m_filenewchange)
 73                {
 74                    fileoldchange = m_filenewchange;
 75                    lock (m_lockHelper)
 76                    {
 77                        m_configinfo = DeserializeInfo(configFilePath, configinfo.GetType());
 78                    }
 79                }
 80            }
 81            else
 82            {
 83                lock (m_lockHelper)
 84                {
 85                    m_configinfo = DeserializeInfo(configFilePath, configinfo.GetType());
 86                }
 87               
 88            }
 89       
 90
 91            return m_configinfo;
 92        }
 93
 94
 95        /**//// <summary>
 96        /// 反序列化指定的类
 97        /// </summary>
 98        /// <param name="configfilepath">config 文件的路径</param>
 99        /// <param name="configtype">相应的类型</param>
100        /// <returns></returns>
101        public static IConfigInfo DeserializeInfo(string configfilepath, Type configtype)
102        {
103
104            IConfigInfo iconfiginfo;
105            FileStream fs = null;
106            try
107            {
108                fs = new FileStream(configfilepath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
109                XmlSerializer serializer = new XmlSerializer(configtype);
110                iconfiginfo = (IConfigInfo)serializer.Deserialize(fs);
111            }
112            catch (Exception ex)
113            {
114                throw ex;
115            }
116            finally
117            {
118                if (fs != null)
119                {
120                    fs.Close();
121                }
122            }
123
124            return iconfiginfo;
125        }
126
127
128        public virtual bool SaveConfig()
129        {
130            return true;
131        }
132
133        /**//// <summary>
134        /// 保存(序列化)指定路径下的配置文件
135        /// </summary>
136        /// <param name="configFilePath">指定的配置文件所在的路径(包括文件名)</param>
137        /// <param name="configinfo">被保存(序列化)的对象</param>
138        /// <returns></returns>
139        public bool SaveConfig(string configFilePath, IConfigInfo configinfo)
140        {
141            bool succeed = false;
142            FileStream fs = null;
143            try
144            {
145                fs = new FileStream(configFilePath, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
146                XmlSerializer serializer = new XmlSerializer(configinfo.GetType());
147                serializer.Serialize(fs, configinfo);
148                //成功则将会返回true
149                succeed = true;
150            }
151            catch (Exception ex)
152            {
153                throw ex;
154            }
155            finally
156            {
157                if (fs != null)
158                {
159                    fs.Close();
160                }
161            }
162
163            return succeed;
164        }
165    }
166
167

    如果您一直关注我们的这个产品,就会从中发现在1.0正式版时,这些类(或实现这些功能的类)
还是零星分面在discuz.forum和discuz.forumpage(2.0正式版改名为discuz.web.dll)等几个DLL文件
中。后来因为考虑软件架构和出于统一配置管理的需求,产品小组将这些类重构到了discuz.config,
从此这些类有了一个“新家”。

    为了便于开发和统一接口调用,我们又创建了两个接口类,就是IConfigFileManager.cs,ICon-
figInfo.cs,它们的声明如下(相关说明见注释):

    IConfigFileManager.cs

   

 1/**//// <summary>
 2    /// Discuz!NT 配置管理类接口
 3    /// </summary>
 4    public interface IConfigFileManager
 5    {
 6        /**//// <summary>
 7        /// 加载配置文件
 8        /// </summary>
 9        /// <returns></returns>
10        IConfigInfo LoadConfig();
11
12
13        /**//// <summary>
14        /// 保存配置文件
15        /// </summary>
16        /// <returns></returns>
17        bool SaveConfig();
18    }
19
20
    IConfigInfo.cs

  

1 /**//// <summary>
2    /// Discuz!NT 配置信息类接口
3    /// </summary>
4    public interface IConfigInfo
5    {
6    }
7
    大家可以看到,其中的 IConfigInfo接口没有任何属性和方法,是一个“空接口”,这主要是为
了提供统一的向上转型需要。当然,如果以后有需要还是会添加一些方法和属性的。
 
    为了减少篇幅,下面只对其中的 GeneralConfig进行相应介绍,一是因为它是核心的配置类,有
关它的使用在项目中不胜枚举。另外它也是这个项目中比较标准的“宝贝”,从一开始,只要有新的
功能往往都会对这个配置类有所“关照”。下面就是通过反射后得到的代码,相关的说明见注释即可:


    论坛全局配置管理类(GeneralConfigFileManager):

   

 1/**//// <summary>
 2    /// 全局配置设置管理类
 3    /// </summary>
 4    class GeneralConfigFileManager : Discuz.Config.DefaultConfigFileManager
 5    {
 6        private static GeneralConfigInfo m_configinfo;
 7
 8     
 9        /**//// <summary>
10        /// 文件修改时间
11        /// </summary>
12        private static DateTime m_fileoldchange;
13
14
15        /**//// <summary>
16        /// 初始化文件修改时间和对象实例
17        /// </summary>
18        static GeneralConfigFileManager()
19        {
20            m_fileoldchange = System.IO.File.GetLastWriteTime(ConfigFilePath);
21
22            try
23            {
24                m_configinfo = (GeneralConfigInfo)DefaultConfigFileManager.DeserializeInfo(ConfigFilePath, typeof(GeneralConfigInfo));
25            }
26            catch
27            {
28                if (File.Exists(ConfigFilePath))
29                {
30                    ReviseConfig();
31                    m_configinfo = (GeneralConfigInfo)DefaultConfigFileManager.DeserializeInfo(ConfigFilePath, typeof(GeneralConfigInfo));
32                }
33            }
34        }
35
36        public new static IConfigInfo ConfigInfo
37        {
38            get { return m_configinfo; }
39            set { m_configinfo = (GeneralConfigInfo) value; }
40        }
41
42        /**//// <summary>
43        /// 配置文件所在路径
44        /// </summary>
45        public static string filename = null;
46
47
48        /**//// <summary>
49        /// 获取配置文件所在路径
50        /// </summary>
51        public new static string ConfigFilePath
52        {
53            get
54            {
55                if (filename == null)
56                {
57                    filename = Utils.GetMapPath(BaseConfigs.GetForumPath + "config/general.config");
58                }
59
60                return filename;
61            }
62
63        }
64
65        /**//// <summary>
66        /// 返回配置类实例
67        /// </summary>
68        /// <returns></returns>
69        public static GeneralConfigInfo LoadConfig()
70        {
71
72            try
73            {
74                ConfigInfo = DefaultConfigFileManager.LoadConfig(ref m_fileoldchange, ConfigFilePath, ConfigInfo, true);
75            }
76            catch
77            {
78                ReviseConfig();
79                ConfigInfo = DefaultConfigFileManager.LoadConfig(ref m_fileoldchange, ConfigFilePath, ConfigInfo, true);
80            }
81            return  ConfigInfo as GeneralConfigInfo;
82        }
83
84        /**//// <summary>
85        /// 保存配置类实例
86        /// </summary>
87        /// <returns></returns>
88        public override bool SaveConfig()
89        {
90            return base.SaveConfig(ConfigFilePath, ConfigInfo);
91        }
92
93

 论坛全局配置描述类(GeneralConfigInfo):

 

Code
  1/**//// <summary>
  2    /// 论坛全局配置描述类, 加[Serializable]标记为可序列化
  3    /// </summary>
  4    [Serializable]
  5    public class GeneralConfigInfo : IConfigInfo
  6        {
  7            私有字段#region 私有字段
  8
  9            private string m_forumtitle = "Discuz!NT"; //论坛名称
 10        private string m_forumurl = "forumindex.aspx"; //论坛url地址
 11        private string m_webtitle = "Discuz!NT"; //网站名称
 12        private string m_weburl = ""; //论坛网站url地址
 13        private int m_licensed = 1; //是否显示商业授权链接
 14        private string m_icp = ""; //网站备案信息
 15        private int m_closed = 0; //论坛关闭
 16        private string m_closedreason = ""; //论坛关闭提示信息
 17        private int m_isframeshow = 0;   //是否以框架方式显示  1是 0不是
 18        private int m_admintools = 0; //是否使用管理员客户端工具,0=不使用,1=仅论坛创始人可用,2=管理员可用
 19            private int m_indexpage = 0; //首页类型, 0=论坛首页, 1=聚合首页
 20            private string m_linktext = "<a href=/"http://nt.discuz.net/" title=/"The Official Discuz!NT Site/" target=/"_blank/">Discuz!NT</a>"; //外部链接html
 21
 22        private string m_passwordkey = "1234567890"; //用户密码Key
 23
 24        private int m_regstatus = 1; //是否允许新用户注册
 25        private int m_regadvance = 1; //注册时候是否显示高级选项
 26            private int m_realnamesystem = 0; //注册时是否启用实名制
 27        private string m_censoruser = "admin"; //用户信息保留关键字
 28        private int m_doublee = 0; //允许同一 Email 注册不同用户
 29        private int m_regverify = 0; //新用户注册验证
 30        private string m_accessemail = ""; //Email允许地址
 31        private string m_censoremail = ""; //Email禁止地址
 32        private int m_hideprivate = 1; //隐藏无权访问的论坛
 33        private int m_regctrl = 0; //IP 注册间隔限制(小时)
 34        private string m_ipregctrl = ""; //特殊 IP 注册限制
 35        private string m_ipdenyaccess = ""; //IP禁止访问列表
 36        private string m_ipaccess = ""; //IP访问列表
 37        private string m_adminipaccess = ""; //管理员后台IP访问列表
 38        private int m_newbiespan = 0; //新手见习期限(单位:分钟)
 39        private int m_welcomemsg = 1; //发送欢迎短消息
 40        private string m_welcomemsgtxt = "Welcome to visit this forum!"; //欢迎短消息内容
 41        private int m_rules = 1; //是否显示注册许可协议
 42        private string m_rulestxt = ""; //许可协议内容
 43        private int m_secques = 0; //是否启用用户登录安全提问
 44
 45        private int m_templateid = 1; //默认论坛风格
 46        private int m_hottopic = 20; //热门话题最低贴数
 47        private int m_starthreshold = 2; //星星升级阀值
 48        private int m_visitedforums = 20; //显示最近访问论坛数量
 49        private int m_maxsigrows = 0; //最大签名高度(行)
 50        private int m_moddisplay = 0; //版主显示方式 0=平面显示 1=下拉菜单
 51        private int m_subforumsindex = 1; //首页是否显示论坛的下级子论坛
 52        private int m_stylejump = 1; //显示风格下拉菜单
 53        private int m_fastpost = 1; //快速发帖
 54        private int m_showsignatures = 1; //是否显示签名
 55        private int m_showavatars = 1; //是否显示头像
 56        private int m_showimages = 1; //是否在帖子中显示图片
 57        private int m_smiliesmax = 30; //帖子中最大允许的表情符数量
 58
 59        private int m_archiverstatus = 1; //启用 Archiver
 60        private string m_seotitle = ""; //标题附加字
 61        private string m_seokeywords = ""; //Meta Keywords
 62        private string m_seodescription = ""; //Meta Description
 63        private string m_seohead = "<meta name=/"generator/" content=/"Discuz!NT/" />"; //其他头部信息
 64
 65        private int m_rssstatus = 1; //rssstatus
 66        private int m_rssttl = 60; //RSS TTL(分钟)
 67            private int m_sitemapstatus = 1; //Sitemap是否开启
 68        private int m_sitemapttl = 12; //Sitemap TTL(小时)
 69        private int m_nocacheheaders = 0; //禁止浏览器缓冲
 70        private int m_fullmytopics = 1; //我的话题全文搜索 0=只搜索用户是主题发表者的主题 1=搜索用户是主题发表者或回复者的主题
 71        private int m_debug = 1; //显示程序运行信息
 72        private string m_rewriteurl = ""; //伪静态url的替换规则
 73        private string m_extname = ".aspx"; //伪静态url的扩展名
 74
 75        private int m_whosonlinestatus = 3; //显示在线用户 0=不显示 1=仅在首页显示 2=仅在分论坛显示 3=在首页和分论坛显示
 76        private int m_maxonlinelist = 300; //最多显示在线人数
 77        private int m_userstatusby = 1; //衡量并显示用户头衔
 78        private int m_forumjump = 1; //显示论坛跳转菜单
 79        private int m_modworkstatus = 1; //论坛管理工作统计
 80        private int m_maxmodworksmonths = 3; //管理记录保留时间(月)
 81
 82        private string m_seccodestatus = "register.aspx,login.aspx"; //使用验证码的页面列表,用","分隔 例如:register.aspx,login.aspx
 83        private int m_guestcachepagetimeout = 0; // 缓存游客页面的失效时间, 为0则不缓存, 大于0则缓存该值的时间(单位:分钟)
 84        private int m_topiccachemark = 0; //缓存游客查看主题页面的权重, 为0则不缓存, 范围0 - 100
 85        private int m_maxonlines = 5000; //最大在线人数
 86        private int m_postinterval = 0; //发帖灌水预防(秒)
 87        private int m_searchctrl = 0; //搜索时间限制(秒)
 88        private int m_maxspm = 5; //60 秒最大搜索次数
 89
 90        private string m_visitbanperiods = ""; //禁止访问时间段
 91        private string m_postbanperiods = ""; //禁止发帖时间段
 92        private string m_postmodperiods = ""; //发帖审核时间段
 93        private string m_attachbanperiods = ""; //禁止下载附件时间段
 94        private string m_searchbanperiods = ""; //禁止全文搜索时间段
 95
 96        private int m_memliststatus = 1; //允许查看会员列表
 97        private int m_dupkarmarate = 0; //允许重复评分
 98        private int m_minpostsize = 1; //帖子最小字数(字节)
 99        private int m_maxpostsize = 10000; //帖子最大字数(字节)
100        private int m_tpp = 26; //每页主题数
101        private int m_ppp = 16; //每页帖子数
102        private int m_maxfavorites = 30; //收藏夹容量
103        private int m_maxavatarsize = 20480; //头像最大尺寸(字节)
104            private int m_maxavatarwidth = 120; //头像最大宽度(像素)
105            private int m_maxavatarheight = 120; //头像最大高度(像素)
106        private int m_maxpolloptions = 10; //投票最大选项数
107        private int m_maxattachments = 10; //最大允许的上传附件数
108
109        private int m_attachimgpost = 1; //帖子中显示图片附件
110        private int m_attachrefcheck = 1; //下载附件来路检查
111        private int m_attachsave = 0; //附件保存方式  0=按年/月/日存入不同目录 1=按年/月/日/论坛存入不同目录 2=按论坛存入不同目录 3=按文件类型存入不同目录
112        private int m_watermarkstatus = 3; //图片附件添加水印 0=不使用 1=左上 2=中上 3=右上 4=左中  9=右下
113        private int m_watermarktype = 0; //图片附件添加何种水印 0=文字 1=图片
114        private int m_watermarktransparency = 5; //图片水印透明度 取值范围1--10 (10为不透明)
115        private string m_watermarktext = "DiscuzNT";  //图片附件添加文字水印的内容 {1}表示论坛标题 {2}表示论坛地址 {3}表示当前日期 {4}表示当前时间, 例如: {3} {4}上传于{1} {2}
116        private string m_watermarkpic = "watermark.gif";   //使用的水印图片的名称
117        private string m_watermarkfontname = "Tahoma"; //图片附件添加文字水印的字体
118        private int m_watermarkfontsize = 12; //图片附件添加文字水印的大小(像素)
119        private int m_showattachmentpath = 0; //图片附件如果直接显示, 地址是否直接使用图片真实路径
120        private int m_attachimgquality = 80; //是否是高质量图片 取值范围0--100
121        private int m_attachimgmaxheight = 0; //附件图片最大高度
122        private int m_attachimgmaxwidth = 0; //附件图片最大宽度
123
124        private int m_reasonpm = 0; //是否将管理操作的理由短消息通知作者
125        private int m_moderactions = 1; //是否在主题查看页面显示管理操作
126        private int m_karmaratelimit = 4; //评分时间限制(小时)
127        private int m_losslessdel = 200; //删贴不减积分时间期限(天)
128        private int m_edittimelimit = 10; //编辑帖子时间限制(分钟)
129        private int m_editedby = 1; //编辑帖子附加编辑记录
130        private int m_defaulteditormode = 1; //默认的编辑器模式 0=ubb代码编辑器 1=可视化编辑器
131        private int m_allowswitcheditor = 1; //是否允许切换编辑器模式
132        private int m_smileyinsert = 1; //显示可点击表情
133            private string m_cookiedomain = "";//身份验证Cookie域
134
135        private int m_passwordmode = 0; //密码模式, 0为默认(32位md5), 1为动网兼容模式(16位md5)
136        private int m_bbcodemode = 0; //UBB模式, 0为默认(标准Discuz!NT代码), 1为动网UBB代码兼容模式
137        private int m_fulltextsearch = 0; //是否启用SQLServer全文检索, 0为不使用, 1为使用
138        private int m_cachelog = 0; //是否使用缓存日志, 0为不使用, 1为使用
139        private int m_onlinetimeout = 10; //多久无动作视为离线
140
141        private int m_topicqueuestats = 0; //是否开启主题统计队列功能
142        private int m_topicqueuestatscount = 20; //主题统计队列长度(浏览量)
143
144            private int m_displayratecount = 100; //评分记录现实的最大数量
145
146       
147            private string m_reportusergroup = "1"; //举报报告用户组
148            private string m_photomangegroups = ""; //图片管理用户组
149
150            private int m_silverlight = 0; //是否开启Silverlight功能 
151            private int m_enablespace = 1; //是否启用个人空间服务,默认是启用
152            private int m_enablealbum = 1; //是否启用相册服务,默认是启用
153   
154            private string m_spacename = "空间"; //空间名称
155            private string m_albumname = "相册"; //相册名称
156            private string m_spaceurl = "spaceindex.aspx"; //空间URL地址
157            private string m_albumurl = "albumindex.aspx"; //相册URL地址
158            private int m_browsecreatetemplate = 0; //浏览时如果模板不存在自动生成否,0为不使用,1为使用
159
160            private string m_ratevalveset = "1,50,200,600,800"; //评分阀值;
161            private int m_topictoblog = 1;//开通空间是转移过去的主题数
162
163            private int m_aspxrewrite = 1; //是否使用伪aspx, 如:showforum-1.aspx等.
164            private int m_viewnewtopicminute = 120; //设置前台"查看新帖"的分钟数
165
166            private int m_htmltitle = 0; //是否使用html标题
167            private string m_htmltitleusergroup = "";  //可以使用html标题的用户组
168
169            private bool m_specifytemplate = false;  //版块是否指定模板
170            #endregion
171
172          相应的属性声明和绑定就不再罗列了

 论坛全局配置类(GeneralConfigs):

 

  1 /**//// <summary>
  2 /// 论坛全局配置类
  3 /// </summary>
  4 public class GeneralConfigs
  5 {
  6  private static object lockHelper = new object();
  7
  8         private static System.Timers.Timer generalConfigTimer = new System.Timers.Timer(15000);
  9
 10         private static GeneralConfigInfo m_configinfo;
 11
 12         /**//// <summary>
 13         /// 静态构造函数初始化相应实例和定时器
 14         /// </summary>
 15         static GeneralConfigs()
 16         {
 17             m_configinfo = GeneralConfigFileManager.LoadConfig();
 18
 19             generalConfigTimer.AutoReset = true;
 20             generalConfigTimer.Enabled = true;
 21             generalConfigTimer.Elapsed += new System.Timers.ElapsedEventHandler(Timer_Elapsed);
 22             generalConfigTimer.Start();
 23         }
 24
 25         private static void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
 26         {
 27             ResetConfig();
 28         }
 29
 30
 31         /**//// <summary>
 32         /// 重设配置类实例
 33         /// </summary>
 34         public static void ResetConfig()
 35         {
 36             m_configinfo = GeneralConfigFileManager.LoadConfig();
 37         }
 38
 39  public static GeneralConfigInfo GetConfig()
 40  {
 41             return m_configinfo;
 42    }
 43
 44       
 45
 46  /**//// <summary>
 47  /// 获取默认模板id
 48  /// </summary>
 49  /// <returns></returns>
 50  public static int GetDefaultTemplateID()
 51  {
 52              return GetConfig().Templateid;
 53      }
 54
 55
 56
 57  /**//// <summary>
 58  /// 获得设置项信息
 59  /// </summary>
 60  /// <returns>设置项</returns>
 61  public static bool SetIpDenyAccess(string denyipaccess)
 62  {
 63   bool result;
 64  
 65   lock(lockHelper)
 66   {
 67    try
 68    {
 69                    GeneralConfigInfo configInfo = GeneralConfigs.GetConfig();
 70     configInfo.Ipdenyaccess = configInfo.Ipdenyaccess + "/n" + denyipaccess;
 71                    GeneralConfigs.Serialiaze(configInfo, Utils.GetMapPath(BaseConfigs.GetForumPath + "config/general.config"));
 72     result = true;
 73    }
 74    catch
 75    {
 76     return false;
 77    }
 78
 79   }
 80   return result;
 81
 82  }
 83
 84
 85  Helper#region Helper
 86
 87  /**//// <summary>
 88  /// 序列化配置信息为XML
 89  /// </summary>
 90  /// <param name="configinfo">配置信息</param>
 91  /// <param name="configFilePath">配置文件完整路径</param>
 92  public static GeneralConfigInfo Serialiaze(GeneralConfigInfo configinfo, string configFilePath)
 93  {
 94   lock(lockHelper)
 95   {
 96    SerializationHelper.Save(configinfo, configFilePath);
 97   }
 98   return configinfo;
 99  }
100
101
102  public static GeneralConfigInfo Deserialize(string configFilePath)
103  {
104   return (GeneralConfigInfo)SerializationHelper.Load(typeof(GeneralConfigInfo), configFilePath);
105  }
106
107  #endregion
108 }
109
110

    通过对general系列配置类的介绍,再看其它的配置类会很清楚了。这里就不再多做解释了,相信2.0开源后
大家看到源码和注释后会有所感悟的。

    另外就是之前因为用到了“序列化”,所以可能会出现所谓的“内存碎片”的问题,详见下面链接:

    而微软官方所推荐的方式如下(http://support.microsoft.com/kb/886385/en-us):

    1. Create one instance of the XmlSerializer class, and put that instance in the cache by using
       the caching APIs. For example, for a .dll file that is named HighSchool, the following code
       caches one instance of the XmlSerializer class:

 

1  XmlSerializer mySerializer = new XmlSerializer(typeof(HighSchool.MyClass), attrOverrides,
2      extraTypes, root, "http://www.microsoft.com");
3  Cache["HighSchoolSerializer"] = mySerializer
 

    2. Use the instance of the XmlSerializer class that you put in the cache instead of creating a
       new XmlSerializer object every time.
       Use the following XmlSerializer class constructors. These class constructors cache the
       assemblies:

       In the .NET Framework version 1.0
      

1public XmlSerializer(Type);
2
       In the .NET Framework version 1.1
     

1  public XmlSerializer(Type type);
2        public XmlSerializer(Type type, string defaultNamespace);
3
 
    3. Declare the XmlSerializer object to be a static member of a class.
    (这种方式是我们项目中所采用的方案)
 

原创粉丝点击