用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) {Configcf = new Config();XmlSerializer ser = new XmlSerializer(typeof(Config));
if (File.Exists(filepath)) {FileStreamfs = 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 {FileStreamfs = 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) {Configcf = 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();
} } }
列表C里是对应的VB.NET代码,后面是先前提到的类。
Public Class Config
Public Property WindowTitle() As String
Get
Return _wndowTitle
End Get
Set(ByVal Value As String)
_wndowTitle = Value
End Set
End Property
Public Property CopyrightText() As String
Get
Return _copyrightText
End Get
Set(ByVal Value As String)
_copyrightText = Value
End Set
End Property
Public Property CustomText() As String
Get
Return _customText
End Get
Set(ByVal Value As String)
_customText = Value
End Set
End Property
Private _wndowTitle As String
Private _copyrightText As String
Private _customText As String
End Class
列表D是应用程序代码。
列表D
Imports System.IO
Imports System.Xml
Imports System.Xml.Serialization
Public Class Form1
Inherits System.Windows.Forms.FormReadOnlyfilepath As String
= "c:\test.xml"
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles MyBase.Load
Dim cf As New Config
Dim ser As New XmlSerializer(cf.GetType)
Dim fs As FileStream
If (File.Exists(filepath))
Thenfs = New FileStream(filepath, FileMode.Open)cf = CType(ser.Deserialize(fs), Config)lblTitle.Text = cf.WindowTitlelblCopyright.Text = cf.CopyrightTexttxtInput.Text = cf.CustomTextfs.Close()
Elsefs = New FileStream(filepath, FileMode.CreateNew)lblTitle.Text = "TechRepublic.com Test
Application"lblCopyright.Text = "2005"
Dim tw As TextWritertw = New StreamWriter(fs)ser.Serialize(tw, cf)tw.Close()fs.Close()
End If
End Sub
Private Sub btnSave_Click(ByVal
sender As System.Object, ByVal
e As System.EventArgs)
Handles btnSave.Click
Dim cf As New Config
With cf
.CopyrightText = lblCopyright.Text
.WindowTitle = lblTitle.Text
.CustomText = txtInput.Text
End With
Dim ser As New XmlSerializer(cf.GetType)
Dim tw As TextWritertw = New StreamWriter(filepath, False)ser.Serialize(tw, cf)tw.Close()
End Sub
End Class
在调入窗体的时候,有一个XML文件会被用来填充窗体里的控件。如果这个文件不存在,那么它就会被创建并被填充。这个窗体里有一个按钮,在被点击的时候会把数据保存在XML文件里。由于它是一个配置文件,所以当窗体被关闭或者数据值发生改变的时候,你可能需要自动地保存这个文件。
用C#和VB.NET分别编写成的代码有一些小小的不同之处,但是它们基本上是一样的。这两种语言之间的一个重要不同之处是大小写敏感性。VB.NET对大小写不敏感,所以需要对类成员变量加上下划线,以便将其与属性名区分开来,而在C#里却没有这个问题。这个简单应用的一个重要方面就是序列化。
序列化
序列化让开发人员能够通过把对象保存在文件里来保存对象。这包括对象的数据和状态。文件可以保存在磁盘驱动器上、数据库里等等。.NET框架为序列化的对象提供了各种不同的命名空间。在本文的示例里,我们用到了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.NET和Windows Forms应用程序有与编程模块相关联的专门配置文件,但是你可以很轻易就利用XML的优势来保存和维护配置信息。(ZDNET)
- 1服务基础架构软件加速企业SOA实施进入新阶段
- 2安全成了VoIP的心结
- 3用围棋理论指导布线施工
- 4从VoIP走到NGeN
- 5SAN进入分层式体系结构
- 6确保Linux环境下文件共享的安全性
- 7提高活动目录安全三种方法
- 8可重构计算为何获芯片业集体追捧
- 9知识管理的价值矩阵和优先级矩阵
- 10中间件新的应用需求
- 11应用服务器向SOA靠拢
- 12中小连锁零售企业信息化优势一念之间
- 13解决信息系统的“亚健康”问题
- 14一种实现无线网络安全的混合方式
- 15Web服务与网格计算融合
- 16终极电子供应链
- 17安全网关的“硬”道理
- 18城域网安全建议
- 19异构平台SAN存储环境的改造方案
- 20CMM通过信息化实现跨越式发展
- 21流媒体服务器架设简明攻略
- 22沈阳OA可以将这样的内容通过固化的方式,形成在OA中
- 233G无线数据业务平台面临的八大技术问题
- 24预测未来的五种攻击手段
- 25网络安全:企业“终端坏死症”的七个迹象
- 26如何选择复合型的网络防火墙
- 27沈阳泛普OA软件的提醒信息树状列表
- 28桌面不要冷落超5类
- 29沈阳oa系统,沈阳oa系统谁家的好?
- 30制造系统将如何演变