|
在软件系统开发中,我们需要使用配置文件来保存一些我们需要保存的系统参数,在.net应用程序中,都默认出现一个App.Config(对于 Web应用程序是Web.Config)我们可以将系统运行所需要的参数采用加密或者明文的方式保存在这个文件中。但是当我们需要大量的,并且有一定逻辑结构的数据,希望也能够保存到配置文件中,此时我们可能这样做:将这些数据构造成DataSet,然后使用DataSet.WriteXML直接写成XML文件,读取的时候直接使用DataSet.LoadXML。另外一种方式就是直接操作XML数据,使用XmlDocument。
第一种方法虽然是好,因为我们可以想操作数据库表一样操作我们的结构化的数据,可是在某些情况下,总觉得怪怪的。并且增加列等等这些的操作觉得及其难受。特别是我们需要使用这些数据的时候,我们首先要去读文档,了解DataSet中的每个表以及每个字段的含义,所以此方法不可取。
那第二种方法呢,这个更不可取。如果我们增加了某个字段,或者修改了数据的机构,那我们的代码修改起来是在也是比较复杂的事情。
那有什么更好的方式来解决这个问题的呢?
既然微软可以使用App.Config和Web.Config,可以使用ComfigManager来对这两个配置文件来进行管理,让我们非常方便地进行使用,那我们为何不可设计自己的ConfigManager呢?
需求:我们这里以菜单结构作为例子来描述我们的想法。
菜单,包括主菜单项,比如系统里面的“文件”,“编辑”等等,包括子菜单,比如“文件”下的“保存”,“另存为”等,子菜单下也包括下级子菜单。总之这是一个完全结构化的数据格式,当然使用菜单来举例主要是这东西我们每天都见到,所以很容易理解,如:
public class Menu { private string _Name; private string _Text; private string _IconName; //...这里可能还有其他你需要变量 private SubMenus _SubMenus;
/// <summary> /// 注意,一定需要一个无参数的构造函数,否则序列化的时候出错 /// </summary> public Menu() : this("", "", "") { }
public Menu(string name, string text, string iconname) { this._Name = name; this._Text = text; this._IconName = iconname;
this._SubMenus = new SubMenus(); }
/// <summary> /// 菜单名 /// </summary> [XmlAttribute("Name")] public string Name { get { return this._Name; } set { this._Name = value; } } /// <summary> /// 菜单Text /// </summary> [XmlAttribute("Text")] public string Text { get { return this._Text; } set { this._Text = value; } } /// <summary> /// 菜单的图标名 /// </summary> [XmlAttribute("IconName")] public string IconName { get { return this._IconName; } set { this._IconName = value; } } /// <summary> /// 子菜单 /// </summary> public SubMenus SubMenus { get { return this._SubMenus; } set { this._SubMenus = value; } } } 好,那我们菜单项包括子菜单,怎么表示呢?
我们使用一个List来保存我们的子菜单,为了更为直观,我们定义一个SubMenus的类,继承于List<Menu>
/// <summary> /// 子菜单列表 /// </summary> public class SubMenus : List<Menu> { } 下面我们就来构造我们的菜单MenuStrip。一个MenuStrip中,同样包括多个菜单,比如“文件”“编辑”“视图”等等。
在MenuStrip中,我们提供Load()函数,用于加载我们的菜单数据,提供Save()用于保存我们设置好的菜单数据:
public class MenuStrip { //...您需要的其他变量 private SubMenus _SubMenus;
public MenuStrip() { this._SubMenus = new SubMenus(); }
public SubMenus SubMenus { get { return this._SubMenus; } set { this._SubMenus = value; } }
/// <summary> /// 这里使用Static,方便调用 /// </summary> /// <returns></returns> public MenuStrip Load() { MenuStrip instance = new MenuStrip(); XmlSerializer xs = new XmlSerializer(typeof(MenuStrip)); StreamReader sr = new StreamReader(@"...\Menu.Config"); instance = xs.Deserialize(sr) as MenuStrip;
sr.Close();
return instance; }
public void Save() { XmlSerializer xs = new XmlSerializer(typeof(MenuStrip)); StreamWriter sw = new StreamWriter(@"...\Menu.Config"); xs.Serialize(sw, this);
sw.Close(); } } 测试代码如下:
共2页: 上一页 1 [2] 下一页
|