我目前正在编写一个IRC客户端,我一直在努力想出一个存储服务器设置的好方法。基本上,大多数IRC客户端都有大量的网络及其服务器。存储设置:XML与SQLite?
我决定使用SQLite,但后来我想让这个列表以XML格式(也许是明确的)在线免费提供,供其他IRC应用程序使用。所以现在我只需要以相同的格式在本地存储设置。
我对于ADO.NET或XML都没有太多经验,所以我不确定他们在这种情况下会如何比较。
用编程方式更容易吗?一个更快吗?有关系吗?
我目前正在编写一个IRC客户端,我一直在努力想出一个存储服务器设置的好方法。基本上,大多数IRC客户端都有大量的网络及其服务器。存储设置:XML与SQLite?
我决定使用SQLite,但后来我想让这个列表以XML格式(也许是明确的)在线免费提供,供其他IRC应用程序使用。所以现在我只需要以相同的格式在本地存储设置。
我对于ADO.NET或XML都没有太多经验,所以我不确定他们在这种情况下会如何比较。
用编程方式更容易吗?一个更快吗?有关系吗?
这是一个比你意识到的难以解决的问题。 “设置”可以涵盖很多事情。
有一个很好的.NET基础设施来处理配置文件中的应用程序设置。这些通常作为全局设置对象的属性暴露给您的程序; System.Configuration
命名空间中的类负责读取并持久化它们,并且Visual Studio中内置了一些工具来自动生成用于处理它们的代码。此基础结构支持的其中一种数据类型是StringCollection
,因此您可以使用它来存储服务器列表。
但是,对于大量的服务器,这不会是我的第一选择,有几个原因。我期望列表中的元素实际上是元组(例如主机名,端口,描述),而不是简单的字符串,在这种情况下,您最终不得不格式化和解析数据以将其转换为StringCollection
,并且这通常表明你应该做其他事情。此外,应用程序设置是只读的(至少在Vista下),并且尽管您可以给设置用户范围以使其持久化,但这会使您在承诺之前走上一条您可能想了解的路径。
所以,我会考虑的另一件事情是:你的服务器列表只是一个列表,还是你有一个内部对象模型代表它?在后一种情况下,我可能会考虑使用XML序列化来存储和检索对象。 (我在应用程序配置文件中保留的唯一东西就是序列化对象文件的路径)。我会这样做,因为序列化和将序列化简单对象转换为XML非常简单;你不必关心设计和测试正确的序列化格式,因为这些工具可以帮你实现。
我使用数据库的主要原因是如果我的程序执行一堆操作,其结果需要是原子性和持久性的,或者由于某种原因,我不希望我的所有数据一次存储在内存中。如果每次X发生,我都希望永久记录它,这引导我使用数据库。一般情况下,您不希望使用XML序列化,因为如果要将所有对象保存到单个物理文件中,则不能实际序列化一个对象。 (虽然简单地序列化整个对象模型以保存一个更改肯定不是疯狂的事实上,这正是我公司的产品所做的,它指向了另一种我不使用数据库的情况:如果数据的模式是经常变化)。
我不确定“原子和持久”是什么意思,你能解释一下吗? – 2009-07-27 23:09:32
我个人会使用XML进行设置--.NET已经构建完成,因此有许多内置工具可用于将设置存储在XML配置文件中。
如果你想使用自定义模式(无论是XML还是数据库)来存储设置,那么我会说XML或SQLite将工作得很好,因为你应该在数据存储周围使用体面的API。
SQLite的.NET包装器 – Sorantis 2009-07-27 19:55:24
每个工具都有自己的权利
有很多炒作的角落找寻XML,我知道了。但是你应该看到,XML基本上是一种交换格式 - 而不是一种存储格式(除非你使用原生的XML数据库,给你更多的选择 - 但也可能会增加一些麻烦)。
当你的配置很小(比如少于10,000条记录)时,你可以使用XML并且没问题。你会把整个东西加载到你的记忆中并访问那里的条目。完成。
但是,当你的配置如此之大,以至于你不想完全加载它,而不是重新考虑你的决定并停留在SQLite中,它可以让你选择动态加载你需要的配置部分。
您还可以提供一个小工具从DB内容创建XML文件 - 从数据库创建XML是一项相当简单的任务。
看起来您在这里有两个单独的应用程序:一个Web服务器和一个桌面客户端(因为传统上这些东西在这里运行),每个都有自己的存储需求。
在服务器端:使用关系数据存储而不是Xml。基本上在某些时候,您需要将用户数据与服务器上的其他用户数据分开。 XML不是一个好的商店。
在客户端:它并不重要。 Xml可能会更容易操作。不要认为,因为你在一个环境中使用了一种技术,你必须在另一个环境中使用它。
这个清单有多大?有多少条记录? – tuinstoel 2009-07-27 20:04:31
可能在几百个。 – 2009-07-27 20:17:40