2011-02-08 112 views
14

我正在用C#編寫遊戲服務器,並希望在服務器運行時從配置文件重新加載或刷新設置。在運行時從外部配置文件重新加載配置設置

理想我想保存在一個XML文件中的設置,讓遊戲服務器運行時編輯 文件,然後向服務器發送命令重新加載 從文件中設置的功能。

我知道我也可以使用數據庫來做到這一點,但遊戲服務器相當小,我認爲將設置保存在平面文件中會更實用。我將對服務器運行的計算機擁有文件級訪問權限。

我應該使用什麼?

+0

這個問題相當主觀。 – Amy 2011-02-08 15:27:50

+3

您可以進行設置,以便服務器使用System.IO.FileSystemWatcher自動加載文件設置。如果使用自定義的`Settings`類,則可以簡單地鎖定類,從文件中重新加載它,解鎖它(如果使用多個線程)。從.NET讀寫文件或序列化在.NET中如此微不足道,這可能不是您需要的幫助。 – 2011-02-08 15:32:09

+0

我也在過去使用過FileSystemWatcher。這是快速,簡單,並完成工作。 – 2011-02-08 15:35:08

回答

13

使用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"); 
0

聽起來像是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); 
0

查看System.Runtime.Caching(.NET 4.0)中的MemoryCache。你可以自己寫一個簡單的類,它執行以下步驟:

  • 加載XML文件
  • 在緩存中的輸出解析其內容成任何表示你希望他們在
  • 存儲與HostFileChangeMonitor看着它 - 這將導致文件被更改時自動從緩存中刪除

在執行上述任何操作之前,您需要檢查緩存以查看是否存在以前緩存的設置副本,如果它能繼續下去sn't。

像這樣滾動您自己的方法的優點是,您不會像存儲在web.config或app.config文件中的AppSettings那樣觸發重新啓動應用程序。 (應該說,這是不是實現這一目標的唯一途徑)

4

根據要求發佈我的評論作爲一個答案:

你可以設置它與FileSystemWatcher所以服務器自動加載的文件設置。如果您使用自定義類Settings,則可以簡單地鎖定類,從文件中重新加載並解鎖它(如果使用多個線程)。

在.NET中讀取/寫入文件或序列化是如此微不足道,這可能不是您需要的幫助,並且有許多選項可以做到。