明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

使用.NET的XML序列化處理系統(tǒng)設(shè)置問(wèn)題

[摘要]在Web系統(tǒng)開(kāi)發(fā)中,我們經(jīng)常需要讀取和設(shè)置一些系統(tǒng)配置項(xiàng),常見(jiàn)的例如數(shù)據(jù)庫(kù)連接字符串、上傳路徑等等。在最初的ASP系統(tǒng)中,比較常用的方法是將值保存為Application或Session變量;在Asp.net系統(tǒng)中,目前比較常見(jiàn)的簡(jiǎn)單方法是把相應(yīng)的配置項(xiàng)寫(xiě)入Web.Config中,例如<?x...
在Web系統(tǒng)開(kāi)發(fā)中,我們經(jīng)常需要讀取和設(shè)置一些系統(tǒng)配置項(xiàng),常見(jiàn)的例如數(shù)據(jù)庫(kù)連接字符串、上傳路徑等等。

在最初的ASP系統(tǒng)中,比較常用的方法是將值保存為Application或Session變量;在Asp.net系統(tǒng)中,目前比較常見(jiàn)的簡(jiǎn)單方法是把相應(yīng)的配置項(xiàng)寫(xiě)入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>



然后在程序中通過(guò)如下方式讀取

string connString = ConfigurationSettings.AppSettings["ConnectionString"];




這種方法在系統(tǒng)規(guī)模較小復(fù)雜度較低的時(shí)候也不失為一種簡(jiǎn)單明了的輕量級(jí)方法,不過(guò)如果系統(tǒng)較復(fù)雜,配置項(xiàng)會(huì)較多,同時(shí)我們需要按不同模塊對(duì)配置進(jìn)行劃分,并且還希望能以面向?qū)ο蠓椒▉?lái)對(duì)其進(jìn)行封裝,那么如果仍然采用這種過(guò)于簡(jiǎn)化方式就不太合時(shí)宜了。

-----------------------------------------------------------------

下面,我講述一下通過(guò)XML類序列化解決系統(tǒng)配置問(wèn)題的方法。

關(guān)于XML類序列化和反序列化(另外一種描述是串行化和并行化)的技術(shù)細(xì)節(jié),大家可以查看MSDN了解;這里簡(jiǎn)單講兩句,XML序列化是把一個(gè)對(duì)象序列化到XML文檔的過(guò)程,反序列化則是從XML輸出中重新創(chuàng)建原始狀態(tài)的對(duì)象。

直觀表現(xiàn)就是如下圖模式


看了這個(gè)圖,就很清楚了,通過(guò)序列化,可以采用面向?qū)ο蟮姆椒,非常自然和方便的讀取和設(shè)置系統(tǒng)配置;.NET Framework承擔(dān)了對(duì)象和XML文件映射工作,我們只需要簡(jiǎn)單的使用就OK。下面我們講一下具體內(nèi)容。

上面圖示已經(jīng)表明,首先需要一個(gè)XML配置文件,格式內(nèi)容如上圖,具體配置項(xiàng)可以自行增減。

然后我們需要編寫(xiě)一個(gè)類,如上圖所示;特殊的一點(diǎn),為了使類能夠?qū)崿F(xiàn)XML序列化,需要在類的所有屬性聲明前添加屬性信息XmlElement,如下所示。

[XmlElement]
public string ConnectionString
{
get { return connectionString; }
set { connectionString = value; }
}



由于AppConfig類本身沒(méi)有實(shí)現(xiàn)方法,因此我們需要一個(gè)配置類AppConfigSetting.cs。類的結(jié)構(gòu)很簡(jiǎn)單,只需要兩個(gè)靜態(tài)方法,Get()獲取AppConfig對(duì)象,Save()保存AppConfig對(duì)象。

另外,我們需要在 Web.Config中添加該XML配置文件的地址。

<appSettings>
<add key="AppConfigPath" value="/FilePath/file.config"/>
</appSettings>



public class AppConfigSetting
{
//獲取配置對(duì)象
public static AppConfig Get()
{
//嘗試獲取緩存中的對(duì)象
AppConfig config = (AppConfig)HttpContext.Current.Cache["AppConfig"];
//如果緩存中沒(méi)有該配置對(duì)象,則直接獲取對(duì)象
if (config == null)
{
//新建序列化對(duì)象并指定其類型
XmlSerializer serial = new XmlSerializer(typeof(AppConfig));

try
{
string file = HttpContext.Current.Server.MapPath(GetFile());

//讀取文件流
FileStream fs = new FileStream(file, FileMode.Open);

//文件流反序列化為對(duì)象
config = (AppConfig)serial.Deserialize(fs);
fs.Close();

//將對(duì)象加入到緩存中
HttpContext.Current.Cache.Insert("AppConfig", config, new CacheDependency(file));
}
catch (System.IO.FileNotFoundException)
{
config = new AppConfig();
}
}

return config;
}
//保存配置對(duì)象
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);
//對(duì)象序列化為文件
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;
}
}




類的使用非常簡(jiǎn)單,基本方式如下

//代碼僅為使用演示
AppConfig config = AppConfigSetting.Get();
string connString = config.ConnectionString;
...
config.ConnectionString = connString;
AppConfigSetting.Save(config);



看到這樣的代碼,不禁有令人賞心悅目之感;相對(duì)于原來(lái)的直接讀取AppSetting,可謂解脫矣! :)


OK,就此結(jié)束了。這篇文章只涉及對(duì)象序列化的非常簡(jiǎn)單的應(yīng)用,沒(méi)有涉及太多的技術(shù)原理和細(xì)節(jié),大家要深入了解請(qǐng)參考MSDN。

希望文章能對(duì)大家有所補(bǔ)益和啟發(fā)。 :)