利用.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。
希望文章能对大家有所补益和启发。 :)
利用.NET的XML序列化解决系统配置问题相关推荐
- [Linux系统] VMware克隆CentOS7,解决网络配置问题
[Linux系统] VMware克隆CentOS7,解决网络配置问题 参考文章: (1)[Linux系统] VMware克隆CentOS7,解决网络配置问题 (2)https://www.cnblog ...
- 电脑启动计算机无法启动 修复工具栏,如何利用Win7启动修复功能解决电脑启动进不了系统的问题...
如何利用Win7启动修复功能解决电脑启动进不了系统的问题 腾讯视频/爱奇艺/优酷/外卖 充值4折起 电脑就像人一样,时常会生点"小病",闹闹"罢工".在所有电脑 ...
- XML序列化以及新增节点XMLHelper
介绍利用XMLHelper类实现XML的新建以及反序列化类的操作,XMLHelper见最底部 1.XML新增 document = XmlHelper.CreateXmlDocument(" ...
- 关于XML序列化与CultureInfo
不同的计算机系统可能有着不同的CultureInfo,例如在中文环境下日期通常这样显示03/30/2016,而在有的操作系统下它可能是这样的30.3.2016. 这样的话带来一个问题,例如在中文环境下 ...
- 序列化之XML序列化技术
优点: 1.可读性比较好, 2.有利于调试 3.XML序列化与语言无关 缺点: 1.序列化化后码流比较大,[主要是因为使用标签对来表示数据] 2.效率不高 使用场景: 1.对性能要求不高,且QPS较低 ...
- c语言xml序列化,C# XML和实体类之间相互转换(序列化和反序列化)
我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改. using System; using System.Collections.Ge ...
- Java对象XML序列化框架-Simple2.0
Java对象XML序列化框架-Simple2.0 Simple是一个XML序列化框架,一个Java 版本宽容的序列化框架,能够快速在Java 平台上开发XML.支持通过annotations完全配置化 ...
- 利用Python的三元表达式解决Odoo中工资条中城镇、农村保险的问题
Python中没有像C#中有三元表达式 A?B:C 但在python中可以通过 A if condition else B 的方式来达到同样的效果. 例如 : 1 if True else 0 输出 ...
- 简单了解各种序列化技术-XML序列化框架介绍
XML序列化的好处在于可读性好,方便阅读和调试.但是序列化以后的字节码文件比较大,而且效率不高,适用于对性能不高,而且QPS较低的企业级内部系统之间的数据交换的场景,同时XML又具有语言无关性,所以还 ...
最新文章
- 组态王怎么做超级曲线_鲁班修图:一款超级好用的修图软件
- 试编写一个将双向循环链表逆置的算法_循环双向链表在电路计算中的应用
- java 单线程改多线程_帮我把单线程的程序改成多线程JAVA,急!
- Jquery中设置表格的悬浮和选中时行的背景颜色
- 【深度学习】CVPR 2021 全部论文链接公布!最新1660篇论文合集!附下载链接
- elasticsearch常见错误解决办法
- 菜单点击展开,超过四个则进行向右滑动显示demo
- 5.8 正则化和数据标准化
- python3开发工具推荐_python开发工具有哪些?我推荐这5款python开发工具!
- 机器学习中常用的优化方法
- mysql格式化11位时间戳_格式化MYSQL时间戳函数FROM_UNIXTIME
- linux启动redis指定端口,linux redis实现自定义运行多端口、多实例 | 极安全-JiSec
- C++模板Trait
- cl.exe nmake.exe
- 运筹学笔记 线性规划与单纯形法
- 杭电1048 The Hardest Problem Ever
- 计算广告第二版电子版_88J9-1图集:室外工程-围墙、围栏(第二版),电子版带走...
- Java中 VO、PO、DO、DTO、BO、QO、DAO、POJO的概念
- 修改jupyter notebook中的tensorflow版本
- C语言: “老板,来两份外卖,一份卤肉饭(%d),一份鸡汤面(%f)...“
热门文章
- 【C++】何时需要自定义拷贝构造函数和赋值符
- EEPW单片机C语言程序设计,基于CH340T的STC89C52RC编程器设计
- MySQL面试题 | 附答案解析(十二)
- 参照STM32时钟树配置STM32CubeMX Clock Configuration(STM32L011G4U6为例)
- 基于视频理解TSM和数据集20bn-jester-v1的27类手势识别
- WifiP2pService工作流程
- 机器学习(实战)facebook地址预测
- LeetCode刷题记录14——257. Binary Tree Paths(easy)
- Python中if__name__==__main__:该如何理解
- 【从零开始的ROS四轴机械臂控制】(二) - ROS与Gazebo连接,Gazebo仿真及urdf文件修改