利用.NET的XML序列化解决系统配置问题

系统 1768 0
作者:未知 请作者速与本人联系 出自: http://blog.csdn.net/ycl111/

在Web系统开发中,我们经常需要读取和设置一些系统配置项,常见的例如数据库连接字符串、上传路径等等。

在最初的ASP系统中,比较常用的方法是将值保存为Application或Session变量;在Asp.net系统中,目前比较常见的简单方法是把相应的配置项写入Web.Config中,例如

                
                  <
                
                ?xml version="1.0" encoding="utf-8" ?
                
                  >
                
                
                  <
                
                configuration
                
                  >
                
                
                  <
                
                system.web
                
                  >
                
                
    ...
  
                
                  <
                
                /system.web
                
                  >
                
                
                  <
                
                appSettings
                
                  >
                
                
                  <
                
                add key="ConnectionString" value="server=(local);database=dbname;uid=username;pwd=password"/
                
                  >
                
                
                  <
                
                /appSettings
                
                  >
                
                
                  <
                
                /configuration
                
                  >
                
              

然后在程序中通过如下方式读取

                string connString = ConfigurationSettings.AppSettings["ConnectionString"];

              


这种方法在系统规模较小复杂度较低的时候也不失为一种简单明了的轻量级方法,不过如果系统较复杂,配置项会较多,同时我们需要按不同模块对配置进行划分,并且还希望能以面向对象方法来对其进行封装,那么如果仍然采用这种过于简化方式就不太合时宜了。

-----------------------------------------------------------------

下面,我讲述一下通过XML类序列化解决系统配置问题的方法。

关于XML类序列化和反序列化(另外一种描述是串行化和并行化)的技术细节,大家可以查看MSDN了解;这里简单讲两句,XML序列化是把一个对象序列化到XML文档的过程,反序列化则是从XML输出中重新创建原始状态的对象。

直观表现就是如下图模式


看了这个图,就很清楚了,通过序列化,可以采用面向对象的方法,非常自然和方便的读取和设置系统配置;.NET Framework承担了对象和XML文件映射工作,我们只需要简单的使用就OK。下面我们讲一下具体内容。

上面图示已经表明,首先需要一个XML配置文件,格式内容如上图,具体配置项可以自行增减。

然后我们需要编写一个类,如上图所示;特殊的一点,为了使类能够实现XML序列化,需要在类的所有属性声明前添加属性信息XmlElement,如下所示。

                [XmlElement]

                
                  public
                
                 string ConnectionString
{
   get { 
                
                  return
                
                 connectionString; }
   set { connectionString = value; }
}

              

由于AppConfig类本身没有实现方法,因此我们需要一个配置类AppConfigSetting.cs。类的结构很简单,只需要两个静态方法,Get()获取AppConfig对象,Save()保存AppConfig对象。

另外,我们需要在 Web.Config中添加该XML配置文件的地址。

                
                  <
                
                appSettings
                
                  >
                
                
                  <
                
                add key="AppConfigPath" value="/FilePath/file.config"/
                
                  >
                
                
                  <
                
                /appSettings
                
                  >
                
              

                
                  public
                
                 class AppConfigSetting
{
   //获取配置对象
   
                
                  public
                
                
                  static
                
                 AppConfig Get()
   {
      //尝试获取缓存中的对象
      AppConfig config = (AppConfig)HttpContext.Current.Cache["AppConfig"];
      //如果缓存中没有该配置对象,则直接获取对象
      
                
                  if
                
                 (config == 
                
                  null
                
                )
      {
         //新建序列化对象并指定其类型
         XmlSerializer serial = 
                
                  new
                
                 XmlSerializer(typeof(AppConfig));
    
         try
         {
            string file = HttpContext.Current.Server.MapPath(GetFile());
      
            //读取文件流
            FileStream fs = 
                
                  new
                
                 FileStream(file, FileMode.Open);
      
            //文件流反序列化为对象
            config = (AppConfig)serial.Deserialize(fs);
            fs.Close();
      
            //将对象加入到缓存中
            HttpContext.Current.Cache.Insert("AppConfig", config, 
                
                  new
                
                 CacheDependency(file));
         }
         catch (
                
                  System
                
                .IO.FileNotFoundException)
         {
            config = 
                
                  new
                
                 AppConfig();
         }
      }
  
      
                
                  return
                
                 config;
   }
   //保存配置对象
   
                
                  public
                
                
                  static
                
                 void Save(AppConfig config)
   {
      string file = HttpContext.Current.Server.MapPath(GetFile());
      XmlSerializer serial = 
                
                  new
                
                 XmlSerializer (typeof(AppConfig));
      FileStream fs = 
                
                  new
                
                 FileStream(file, FileMode.Create);
      //对象序列化为文件
      serial.Serialize(fs, config);
      fs.Close();
   }
   //获取配置文件路径
   
                
                  private
                
                
                  static
                
                 string GetFile()
   {
      string path = (string)HttpContext.Current.Cache["FilePath"];
      
                
                  if
                
                 (path == 
                
                  null
                
                )
      {
         path=ConfigurationSettings.AppSettings["AppConfigPath"];
         HttpContext.Current.Cache["FilePath"] = path;
      }
      
                
                  return
                
                 path;
   }
}

              


类的使用非常简单,基本方式如下

                //代码仅为使用演示
AppConfig config = AppConfigSetting.Get();
string connString = config.ConnectionString;
...
config.ConnectionString = connString;
AppConfigSetting.Save(config);

              

看到这样的代码,不禁有令人赏心悦目之感;相对于原来的直接读取AppSetting,可谓解脱矣! :)


OK,就此结束了。这篇文章只涉及对象序列化的非常简单的应用,没有涉及太多的技术原理和细节,大家要深入了解请参考MSDN。

希望文章能对大家有所补益和启发。 :)

利用.NET的XML序列化解决系统配置问题


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论