2011-02-08 93 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中读取/写入文件或序列化是如此微不足道,这可能不是您需要的帮助,并且有许多选项可以做到。