如何用XML保存配置设定

我最近和一些刚刚接触.NET框架的开发人员一起工作,他们对保存配置信息的概念是头疼得抓耳挠腮。他们的问题卡在原有的使用初始化文件(ini文件)或者文本文件的概念上。我利用 XML把他们从老路领到了更适合.NET的新路上。
<script type="text/javascript"> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>
尽管 ASP.NET的Web Forms和 Windows Forms都为应用程序的数据提供了配置文件,但是你可以总是最终归结到使用.NET的一个主要特性——XML上来。现在就让我们仔细看看如何把应用程序数据保存在XML文件里吧。

XML是关键   

    XML是Web服务运动中很多技术的支柱,它也是.NET框架的一个标准特性。明白了这一点,我们就可以很容易地利用XML的优势和相关的特性来保存特定的应用程序数据。首先要定义我们将要使用的数据的结构或者细节。

    可以创建一个数据需要使用的结构或者类。在我们这个简单的示例里,我们将要保存应用程序的名称、窗口的标题,以及用户输入的一些文本。这些值都通过类属性来维护。你可以使用列表A里的C#类。

列表A 
using  System;
namespace  XMLConfigCSharp 
{
[ Serializable() ]
public class Config 
{
public Config() { }
public string WindowTitle 
{
    
get {
    
return windowTitle;
    }

    
set {windowTitle = value;
    }
 
}

public string CopyrightText
{
    
get {
    
return copyrightText;
    }

    
set {copyrightText = value;
    }
 
}

public string CustomText
{
    
get {
    
return customText;
        }

    
set {customText = value;
    }

}

private string windowTitle;
private string copyrightText;
private string customText;
}

}


这段代码中的一个关键就是类是可以序列化的,所以这使得把类的实例序列化到磁盘上以维持其状态成为可能。然后,我们把这个类用到一个非常基本的 Windows Forms应用程序上。这个类的属性被用来填充两个标签控件。此外,用户还可以在一个文本字段里输入文本。在文本字段里输入的数据通过 CustomText属性的方式被保存。列表B里是C#示例代码。
  列表B
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
namespace XMLConfig 

{
public class Form1 : Form

    
{
        
private Label lblTitle;
        
private Label lblCopyright;
        
private Button btnSave;
        
private TextBoxtxtInput;
        
readonly string filepath = "c:test.xml";
        
private void Form1_Load(object sender, System.EventArgs e) 
        
{
            Config cf 
= new Config();
            XmlSerializer ser 
= new XmlSerializer(typeof(Config));
          
if (File.Exists(filepath)) 
              
{
                  FileStream fs 
= new FileStream(filepath, FileMode.Open);
                  cf 
= (Config)ser.Deserialize(fs);
                  lblTitle.Text 
= cf.WindowTitle;
                  lblCopyright.Text 
= cf.CopyrightText;
                  txtInput.Text 
= cf.CustomText;fs.Close();
                }
 else
                
             
{
                 FileStream fs 
= new FileStream(filepath, FileMode.CreateNew);
                 lblTitle.Text 
= "TechRepublic.com Test Application";
                 lblCopyright.Text 
= "2005";
                 TextWritertw 
= new StreamWriter(fs);
                 ser.Serialize(tw, cf);tw.Close();
                 fs.Close();
                }
 
        }

        
private void btnSave_Click(object sender, System.EventArgs e)
            
{
                Config cf 
= new Config();
                cf.CopyrightText 
= lblCopyright.Text;
                cf.WindowTitle 
= lblTitle.Text;
                cf.CustomText 
= txtInput.Text;
                XmlSerializer ser 
= new XmlSerializer(typeof(Config));
                TextWritertw 
= new StreamWriter(filepath, false);
                ser.Serialize(tw, cf);
                tw.Close();
            }
 
    }
 
}

在调入窗体的时候,有一个XML文件会被用来填充窗体里的控件。如果这个文件不存在,那么它就会被创建并被填充。这个窗体里有一个按钮,在被点击的 时候会把数据保存在XML文件里。由于它是一个配置文件,所以当窗体被关闭或者数据值发生改变的时候,你可能需要自动地保存这个文件。

    用C#和VB.NET分别编写成的代码有一些小小的不同之处,但是它们基本上是一样的。这两种语言之间的一个重要不同之处是大小写敏感性。VB.NET对 大小写不敏感,所以需要对类成员变量加上下划线,以便将其与属性名区分开来,而在C#里却没有这个问题。这个简单应用的一个重要方面就是序列化。


序列化
    序列化让开发人员能够通过把对象保存在文件里来保存对象。这包括对象的数据和状态。文件可以保存在磁盘驱动器上、数据库里等等。.NET框架为序列化的对象提供了各种不同的命名空间。

<script type="text/javascript"> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>
在本文的示例里,我们用到了System.Runtime.Serialization这个命名空间。要对一个对象进行 序列化,你需要用[Serializable]属性来标记这个对象,或者需要实现Iserializable接口。如前所述,我们通过加入 Serializable属性创建了一个Serializable(可序列化)的Config文件。关于序列化,先前的专栏文章有更加详细的叙述。

保存位置
    使用XML来 保存配置数据文件是非常理想的,但是一个重要的问题是决定把已经完成序列化的文件保存在哪里。一个选择是像SQL服务器这样的后端数据库。在我们的示例程 序里,我们用到了本地磁盘C的根目录,但是这没有什么很吸引人的。微软建议把应用程序数据保存在下面这三个能够用System.Environment类 访问得到的位置,这些目录都可以通过使用下面这三个值调用GetFolderPath方法访问到:

        Environment.SpecialFolder.ApplicationData:这是当前用户的目录,网络上所有的机器都可以共享到。
        Environment.SpecialFolder.CommonApplicationData:这个保存信息的目录可以由所有机器上的所有用户都共享得到。
        Environment.SpecialFolder.LocalApplicationData:这个目录只能够由登录到本机的当前用户访问得到。

    列表E里的代码段显示了我的机器上这三个变量中每个变量的设置状况。这个列表还带有代码段的输出结果。注意:这只是建议的目录;你可以选择使用不同的目录。

列表E
Console.WriteLine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));
Console.WriteLine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData));
Console.WriteLine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData));

The simple code produces the following output:

C:Documents and SettingsTony PattonApplication Data
C:Documents and SettingsAll UsersApplication Data
C:Documents and SettingsTony PattonLocal SettingsApplication Data




维护应用程序数据
    .NET框架提供了很多方法来维护应用程序专用的配置数据。虽然 ASP.NETWindows Forms应用程序有与编程模块相关联的专门配置文件,但是你可以很轻易就利用XML的优势来保存和维护配置信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值