我正在用C#編寫遊戲服務器,並希望在服務器運行時從配置文件重新加載或刷新設置。在運行時從外部配置文件重新加載配置設置
理想我想保存在一個XML文件中的設置,讓遊戲服務器運行時編輯 文件,然後向服務器發送命令重新加載 從文件中設置的功能。
我知道我也可以使用數據庫來做到這一點,但遊戲服務器相當小,我認爲將設置保存在平面文件中會更實用。我將對服務器運行的計算機擁有文件級訪問權限。
我應該使用什麼?
我正在用C#編寫遊戲服務器,並希望在服務器運行時從配置文件重新加載或刷新設置。在運行時從外部配置文件重新加載配置設置
理想我想保存在一個XML文件中的設置,讓遊戲服務器運行時編輯 文件,然後向服務器發送命令重新加載 從文件中設置的功能。
我知道我也可以使用數據庫來做到這一點,但遊戲服務器相當小,我認爲將設置保存在平面文件中會更實用。我將對服務器運行的計算機擁有文件級訪問權限。
我應該使用什麼?
使用http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.aspx
使用自定義配置部分,通過設置節的位置attrib將app.config中的節連接到外部配置文件。所有XML加載和系列化由
代碼由CarelZA提供的自定義類進行:
首先,通過ConfigurationManager中配置部分緩存的應用程序的配置,你可以調用ConfigurationManager.RefreshSection()無效特定部分的緩存。
在我的app.config說:
<configSections>
<section name="gameSettings"
type="System.Configuration.NameValueSectionHandler,system , Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null"/>
</configSections>
<gameSettings configSource="game.config"/>
我創建了一個名爲「game.config」,並設置文件「複製到輸出目錄」爲「始終複製」。
在game.config:
<gameSettings>
<add key="SettingName" value="SettingValue" />
</gameSettings>
然後,在代碼中,爲了訪問任何設置:
settings = (NameValueCollection) ConfigurationManager.GetSection("gameSettings");
return settings["SettingName"];
而且,在任何時候重新加載遊戲配置時重載命令被髮送到服務器:
ConfigurationManager.RefreshSection("gameSettings");
聽起來像是XML序列化的工作!您可以通過創建設置對象,將其序列化爲XML以及在需要進行修改時對其進行序列化來輕鬆實現同樣的效果,而不是手動解析和編輯XML。這樣,你可以熱切換配置文件。
using System.Xml.Serialization;
例如,你可以有對象
public class Settings
{
public string SomeProperty {get; set;}
public string SomeProperty2 {get; set;}
}
保存到您的磁盤,
var settings = new Settings {SomeProperty="Hello", SomeProperty2="Joe"};
var fs = new FileStream("settings.xml");
var xs = new XmlSerializer(settings.GetType());
xs.Serialize(fs,settings);
讀回作爲,
var fs = new FileStream("settings.xml");
var settings = (Settings)fs.Deserialize(fs);
查看System.Runtime.Caching(.NET 4.0)中的MemoryCache。你可以自己寫一個簡單的類,它執行以下步驟:
在執行上述任何操作之前,您需要檢查緩存以查看是否存在以前緩存的設置副本,如果它能繼續下去sn't。
像這樣滾動您自己的方法的優點是,您不會像存儲在web.config或app.config文件中的AppSettings那樣觸發重新啓動應用程序。 (應該說,這是不是實現這一目標的唯一途徑)
根據要求發佈我的評論作爲一個答案:
你可以設置它與FileSystemWatcher所以服務器自動加載的文件設置。如果您使用自定義類Settings
,則可以簡單地鎖定類,從文件中重新加載並解鎖它(如果使用多個線程)。
在.NET中讀取/寫入文件或序列化是如此微不足道,這可能不是您需要的幫助,並且有許多選項可以做到。
這個問題相當主觀。 – Amy 2011-02-08 15:27:50
您可以進行設置,以便服務器使用System.IO.FileSystemWatcher自動加載文件設置。如果使用自定義的`Settings`類,則可以簡單地鎖定類,從文件中重新加載它,解鎖它(如果使用多個線程)。從.NET讀寫文件或序列化在.NET中如此微不足道,這可能不是您需要的幫助。 – 2011-02-08 15:32:09
我也在過去使用過FileSystemWatcher。這是快速,簡單,並完成工作。 – 2011-02-08 15:35:08