`
varsoft
  • 浏览: 2435433 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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

阅读更多
作者:未知 请作者速与本人联系 出自: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。

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

分享到:
评论

相关推荐

    asp.net知识库

    泛型的序列化问题 .NET 2.0 泛型在实际开发中的一次小应用 C#2.0 Singleton 的实现 .Net Framwork 强类型设计实践 通过反射调用類的方法,屬性,字段,索引器(2種方法) ASP.NET: State Server Gems 完整的动态加载/卸载...

    通用管理系统配置源码

    通用管理系统系统配置源码 许多应用程序都需要配置 这种配置可以用数据库作为存储,但是仅仅为了一个记录,建立一个表格,有点太浪费,所以最好用xml进行以文本方式存放,在配置不大的情况下,读写文本文件比...

    北京中科信软 Visual Basic.NET培训

    XML序列化 Web Service WSDL,SOAP,UDDI,生成XML Web Service Web Service中的异步调用,状态管理 事务处理,安全性,自定义身份验证 Visual Studio Team System 中的单元测试与Web测试 案例分析:基于.NET...

    YQBlog - 基于Asp.Net MVC3 EF4.0技术的个人博客系统

    xml的序列化以及反序列化,配置信息general.config 部分。 Ajax异步:Jquery方式以及MVC方式 评论提交,评论显示,文章推荐等 Jquery 程序中的js基于jquery编写 用到的一些jquery插件: jquery.lazyload.js...

    asp.net技术内幕(1)

    第一部分 使用ASP.NET Web表单 &lt;br&gt;第1章 建立ASP.NET页面 &lt;br&gt;1.1 ASP.NET和.NET框架 1.1.1 .NET框架类库 1.1.2 理解名称空间 1.1.3 标准的ASP.NET名称空间 1.1.4 与.NET框架兼容的语言 ...

    ASP.NET4高级程序设计第4版 带目录PDF 分卷压缩包 part1

    12.3 序列化 12.4 总结 第13章 LINQ 13.1 LINQ基础 13.1.1 延迟执行 13.1.2 LINQ是如何工作的 13.1.3 LINQ表达式 13.1.4 揭秘LINQ表达式 13.2 LINQ to DataSet 13.2.1 强类型的DataSet 13.2.2...

    ASP.NET4高级程序设计(第4版) 3/3

    12.3 序列化 423 12.4 总结 426 第13章 LINQ 427 13.1 LINQ基础 427 13.1.1 延迟执行 429 13.1.2 LINQ是如何工作的 429 13.1.3 LINQ表达式 430 13.1.4 揭秘LINQ表达式 436 13.2 LINQ to DataSet ...

    .net技术资料大全(语言规范 源码教程 学习笔记 技术资料 .net代码生成器)

    解决VS.NET使用中属性框不显示的问题.txt 里的InputBox.txt 模拟鼠标和键盘操作.txt 取CPU的序列号.txt 如何:在VisualC#.NET中建立一个平滑的进度条.txt 如何得到网卡号.txt 如何调用WindowsAPI的要点.txt ...

    Visual.Basic.2010.&.NET4.高级编程(第6版)-文字版.pdf

    9.2 xml序列化 343 9.3 system.xml文档支持 348 9.4 xml流样式分析程序 348 9.4.1 写入xml流 349 9.4.2 读取xml流 352 9.4.3 文档对象模型(dom) 360 9.5 xslt转换 364 9.5.1 使用xslt转换不同的xml...

    ASP.net技术内幕

    内容包括:ASP.NET Web表单的使用,高级ASP.NET页面的开发,ADO.NET的使用,ASP.NET应用程序的使用, ASP.NET应用程序的保护,ASP.NET Web服务的建立,.NET框架的利用,自定义的ASP.NET控件的建立,ASP.NET的应用...

    .NET之美:.NET关键技术深入分析

    8.3.3 自定义序列化过程 8.4本章小结 第9章.NET中的加密和解密 9.1加密和解密的相关概念 9.1.1散列运算 9.1.2对称加密 9.1.3非对称加密 9.1.4数字签名 9.1.5综合实现 9.1.6证书机制 9.2.NET对加密和解密的...

    ASP.NET的网页代码模型及生命周期

    在创建了ASP.NET应用程序后,系统同样会默认创建一个Default.aspx页面,不同的是,多出了一个Default.aspx.designer.cs,用来初始化页面控件,一般不需要修改。 4.1.5 ASP.NET网站和ASP.NET应用程序的区别 在ASP.NET...

    asp.net技术内幕(2)

    第一部分 使用ASP.NET Web表单 &lt;br&gt;第1章 建立ASP.NET页面 &lt;br&gt;1.1 ASP.NET和.NET框架 1.1.1 .NET框架类库 1.1.2 理解名称空间 1.1.3 标准的ASP.NET名称空间 1.1.4 与.NET框架兼容的语言 ...

    asp.net技术内幕(5)

    第一部分 使用ASP.NET Web表单 &lt;br&gt;第1章 建立ASP.NET页面 &lt;br&gt;1.1 ASP.NET和.NET框架 1.1.1 .NET框架类库 1.1.2 理解名称空间 1.1.3 标准的ASP.NET名称空间 1.1.4 与.NET框架兼容的语言 ...

    asp.net技术内幕(4)

    第一部分 使用ASP.NET Web表单 &lt;br&gt;第1章 建立ASP.NET页面 &lt;br&gt;1.1 ASP.NET和.NET框架 1.1.1 .NET框架类库 1.1.2 理解名称空间 1.1.3 标准的ASP.NET名称空间 1.1.4 与.NET框架兼容的语言 ...

    asp.net技术内幕(3)

    第一部分 使用ASP.NET Web表单 &lt;br&gt;第1章 建立ASP.NET页面 &lt;br&gt;1.1 ASP.NET和.NET框架 1.1.1 .NET框架类库 1.1.2 理解名称空间 1.1.3 标准的ASP.NET名称空间 1.1.4 与.NET框架兼容的语言 ...

    asp.net面试题

    序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。 5.概述o/r mapping 的...

Global site tag (gtag.js) - Google Analytics