當(dāng)前位置:工程項(xiàng)目OA系統(tǒng) > 泛普各地 > 遼寧OA系統(tǒng) > 沈陽(yáng)OA系統(tǒng) > 沈陽(yáng)OA快博
用XML保存配置設(shè)定
申請(qǐng)免費(fèi)試用、咨詢(xún)電話:400-8352-114
文章來(lái)源:泛普軟件 我最近和一些剛剛接觸.NET框架的開(kāi)發(fā)人員一起工作,他們對(duì)保存配置信息的概念是頭疼得抓耳撓腮。他們的問(wèn)題卡在原有的使用初始化文件(ini文件)或者文本文件的概念上。我利用XML把他們從老路領(lǐng)到了更適合.NET的新路上。盡管ASP.NET的Web Forms和Windows Forms都為應(yīng)用程序的數(shù)據(jù)提供了配置文件,但是你可以總是最終歸結(jié)到使用.NET的一個(gè)主要特性——XML上來(lái)?,F(xiàn)在就讓我們仔細(xì)看看如何把應(yīng)用程序數(shù)據(jù)保存在XML文件里吧。XML是關(guān)鍵
XML是Web服務(wù)運(yùn)動(dòng)中很多技術(shù)的支柱,它也是.NET框架的一個(gè)標(biāo)準(zhǔn)特性。明白了這一點(diǎn),我們就可以很容易地利用XML的優(yōu)勢(shì)和相關(guān)的特性來(lái)保存特定的應(yīng)用程序數(shù)據(jù)。首先要定義我們將要使用的數(shù)據(jù)的結(jié)構(gòu)或者細(xì)節(jié)。
可以創(chuàng)建一個(gè)數(shù)據(jù)需要使用的結(jié)構(gòu)或者類(lèi)。在我們這個(gè)簡(jiǎn)單的示例里,我們將要保存應(yīng)用程序的名稱(chēng)、窗口的標(biāo)題,以及用戶輸入的一些文本。這些值都通過(guò)類(lèi)屬性來(lái)維護(hù)。你可以使用列表A里的C#類(lèi)。
列表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;
}}
這段代碼中的一個(gè)關(guān)鍵就是類(lèi)是可以序列化的,所以這使得把類(lèi)的實(shí)例序列化到磁盤(pán)上以維持其狀態(tài)成為可能。然后,我們把這個(gè)類(lèi)用到一個(gè)非?;镜腤indows Forms應(yīng)用程序上。這個(gè)類(lèi)的屬性被用來(lái)填充兩個(gè)標(biāo)簽控件。此外,用戶還可以在一個(gè)文本字段里輸入文本。在文本字段里輸入的數(shù)據(jù)通過(guò)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里是對(duì)應(yīng)的VB.NET代碼,后面是先前提到的類(lèi)。
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是應(yīng)用程序代碼。
列表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
在調(diào)入窗體的時(shí)候,有一個(gè)XML文件會(huì)被用來(lái)填充窗體里的控件。如果這個(gè)文件不存在,那么它就會(huì)被創(chuàng)建并被填充。這個(gè)窗體里有一個(gè)按鈕,在被點(diǎn)擊的時(shí)候會(huì)把數(shù)據(jù)保存在XML文件里。由于它是一個(gè)配置文件,所以當(dāng)窗體被關(guān)閉或者數(shù)據(jù)值發(fā)生改變的時(shí)候,你可能需要自動(dòng)地保存這個(gè)文件。
用C#和VB.NET分別編寫(xiě)成的代碼有一些小小的不同之處,但是它們基本上是一樣的。這兩種語(yǔ)言之間的一個(gè)重要不同之處是大小寫(xiě)敏感性。VB.NET對(duì)大小寫(xiě)不敏感,所以需要對(duì)類(lèi)成員變量加上下劃線,以便將其與屬性名區(qū)分開(kāi)來(lái),而在C#里卻沒(méi)有這個(gè)問(wèn)題。這個(gè)簡(jiǎn)單應(yīng)用的一個(gè)重要方面就是序列化。
序列化
序列化讓開(kāi)發(fā)人員能夠通過(guò)把對(duì)象保存在文件里來(lái)保存對(duì)象。這包括對(duì)象的數(shù)據(jù)和狀態(tài)。文件可以保存在磁盤(pán)驅(qū)動(dòng)器上、數(shù)據(jù)庫(kù)里等等。.NET框架為序列化的對(duì)象提供了各種不同的命名空間。在本文的示例里,我們用到了System.Runtime.Serialization這個(gè)命名空間。要對(duì)一個(gè)對(duì)象進(jìn)行序列化,你需要用[Serializable]屬性來(lái)標(biāo)記這個(gè)對(duì)象,或者需要實(shí)現(xiàn)Iserializable接口。如前所述,我們通過(guò)加入Serializable屬性創(chuàng)建了一個(gè)Serializable(可序列化)的Config文件。關(guān)于序列化,先前的專(zhuān)欄文章有更加詳細(xì)的敘述。
保存位置
使用XML來(lái)保存配置數(shù)據(jù)文件是非常理想的,但是一個(gè)重要的問(wèn)題是決定把已經(jīng)完成序列化的文件保存在哪里。一個(gè)選擇是像SQL服務(wù)器這樣的后端數(shù)據(jù)庫(kù)。在我們的示例程序里,我們用到了本地磁盤(pán)C的根目錄,但是這沒(méi)有什么很吸引人的。微軟建議把應(yīng)用程序數(shù)據(jù)保存在下面這三個(gè)能夠用System.Environment類(lèi)訪問(wèn)得到的位置,這些目錄都可以通過(guò)使用下面這三個(gè)值調(diào)用GetFolderPath方法訪問(wèn)到:
Environment.SpecialFolder.ApplicationData:這是當(dāng)前用戶的目錄,網(wǎng)絡(luò)上所有的機(jī)器都可以共享到。
Environment.SpecialFolder.CommonApplicationData:這個(gè)保存信息的目錄可以由所有機(jī)器上的所有用戶都共享得到。
Environment.SpecialFolder.LocalApplicationData:這個(gè)目錄只能夠由登錄到本機(jī)的當(dāng)前用戶訪問(wèn)得到。
列表E里的代碼段顯示了我的機(jī)器上這三個(gè)變量中每個(gè)變量的設(shè)置狀況。這個(gè)列表還帶有代碼段的輸出結(jié)果。注意:這只是建議的目錄;你可以選擇使用不同的目錄。
列表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
維護(hù)應(yīng)用程序數(shù)據(jù)
.NET框架提供了很多方法來(lái)維護(hù)應(yīng)用程序?qū)S玫呐渲脭?shù)據(jù)。雖然ASP.NET和Windows Forms應(yīng)用程序有與編程模塊相關(guān)聯(lián)的專(zhuān)門(mén)配置文件,但是你可以很輕易就利用XML的優(yōu)勢(shì)來(lái)保存和維護(hù)配置信息。(ZDNET)
- 1西安OA快博
- 2廣州OA快博
- 3深圳OA快博
- 4南京OA快博
- 5長(zhǎng)沙OA快博
- 6合肥OA快博
- 7青島OA快博
- 8上海OA快博
- 9石家莊OA快博
- 10沈陽(yáng)OA快博
- 11長(zhǎng)春OA快博
- 12哈爾濱OA快博
- 1服務(wù)基礎(chǔ)架構(gòu)軟件加速企業(yè)SOA實(shí)施進(jìn)入新階段
- 2安全成了VoIP的心結(jié)
- 3用圍棋理論指導(dǎo)布線施工
- 4從VoIP走到NGeN
- 5SAN進(jìn)入分層式體系結(jié)構(gòu)
- 6確保Linux環(huán)境下文件共享的安全性
- 7提高活動(dòng)目錄安全三種方法
- 8可重構(gòu)計(jì)算為何獲芯片業(yè)集體追捧
- 9知識(shí)管理的價(jià)值矩陣和優(yōu)先級(jí)矩陣
- 10中間件新的應(yīng)用需求
- 11應(yīng)用服務(wù)器向SOA靠攏
- 12中小連鎖零售企業(yè)信息化優(yōu)勢(shì)一念之間
- 13解決信息系統(tǒng)的“亞健康”問(wèn)題
- 14一種實(shí)現(xiàn)無(wú)線網(wǎng)絡(luò)安全的混合方式
- 15Web服務(wù)與網(wǎng)格計(jì)算融合
- 16終極電子供應(yīng)鏈
- 17安全網(wǎng)關(guān)的“硬”道理
- 18城域網(wǎng)安全建議
- 19異構(gòu)平臺(tái)SAN存儲(chǔ)環(huán)境的改造方案
- 20CMM通過(guò)信息化實(shí)現(xiàn)跨越式發(fā)展
- 21流媒體服務(wù)器架設(shè)簡(jiǎn)明攻略
- 22沈陽(yáng)OA可以將這樣的內(nèi)容通過(guò)固化的方式,形成在OA中
- 233G無(wú)線數(shù)據(jù)業(yè)務(wù)平臺(tái)面臨的八大技術(shù)問(wèn)題
- 24預(yù)測(cè)未來(lái)的五種攻擊手段
- 25網(wǎng)絡(luò)安全:企業(yè)“終端壞死癥”的七個(gè)跡象
- 26如何選擇復(fù)合型的網(wǎng)絡(luò)防火墻
- 27沈陽(yáng)泛普OA軟件的提醒信息樹(shù)狀列表
- 28桌面不要冷落超5類(lèi)
- 29沈陽(yáng)oa系統(tǒng),沈陽(yáng)oa系統(tǒng)誰(shuí)家的好?
- 30制造系統(tǒng)將如何演變
成都公司:成都市成華區(qū)建設(shè)南路160號(hào)1層9號(hào)
重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓