我有一个应用程序需要极少的持久存储。实际上,我们谈论的是 < 30 个整数。应用程序所需要的只是在下次启动时知道这些整数(并且整数在运行时会发生变化)。
数据库对此太过分了,但我也不想只使用文本文件。
C# 是否有任何机制可以在运行之间保持这样的小值?我注意到您可以将内容存储在资源文件和其他一些地方 - 我不知道您是否可以在运行时更改它们。我只是为了一份新工作而学习 C# 和 .NET,如果这是一个愚蠢的问题,我深表歉意!
我有一个应用程序需要极少的持久存储。实际上,我们谈论的是 < 30 个整数。应用程序所需要的只是在下次启动时知道这些整数(并且整数在运行时会发生变化)。
数据库对此太过分了,但我也不想只使用文本文件。
C# 是否有任何机制可以在运行之间保持这样的小值?我注意到您可以将内容存储在资源文件和其他一些地方 - 我不知道您是否可以在运行时更改它们。我只是为了一份新工作而学习 C# 和 .NET,如果这是一个愚蠢的问题,我深表歉意!
这是另一篇 SO帖子的摘要,解释了如何设置应用程序设置,这是一个基于文件的简单解决方案,用于读取/写入值。
"如果您使用 Visual Studio,那么很容易获得持久设置。右键单击解决方案资源管理器中的项目,选择属性。选择设置选项卡,如果设置不存在,请单击超链接。使用设置选项卡创建应用程序设置。Visual Studio 创建文件 Settings.settings 和 Settings.Designer.settings,其中包含从 ApplicationSettingsBase 继承的单例类 Settings。您可以从代码中访问此类以读取/写入应用程序设置: “
Settings.Default["SomeProperty"] = "Some Value";
Settings.Default.Save(); // Saves settings in application configuration file
您可以将列表序列化为 xml 文件。这是您保存它的方式:
var xs = new System.Xml.Serialization.XmlSerializer(typeof(List<int>));
List<int> ints = new List<int> { 1, 2, 3 };
using (FileStream fs = new FileStream(@"C:\store.xml", FileMode.OpenOrCreate))
{
xs.Serialize(fs, ints);
}
检索它同样容易:
using (FileStream fs = new FileStream(@"C:\store.xml", FileMode.OpenOrCreate))
{
ints = xs.Deserialize(fs) as List<int>;
}
我会使用嵌入的 sqlite 数据库。
http://www.codeproject.com/Articles/22165/Using-SQLite-in-your-C-Application
SQLite 是一个小型、快速且可嵌入的数据库,其中数据库引擎和接口组合到一个库中。它还能够将所有数据存储在一个文件中。因此,如果您的应用程序需要一个独立的数据库,SQLite 可能是您的完美选择。当然,选择 SQLite 还有其他原因,包括:
SQLite 内存占用小,访问数据库只需要一个库,非常适合嵌入式数据库应用程序。SQLite 已被移植到许多平台,甚至可以在 Windows CE 和 Palm OS 上运行。SQLite 符合 ACID,满足所有四个标准 - 原子性、一致性、隔离性和持久性。SQLite 实现了 ANSI-92 SQL 标准的一个大子集,包括视图、子查询和触发器。没有额外的数据库驱动程序的问题,需要 ODBC 配置。只需将库和数据文件包含在您的应用程序中即可。SQLite 有用于 C/C++、PHP、Perl、Python、Tcl 等的原生语言 API。C# 的原生 API 仍然不存在。
如果您使用的是 c# 4.0 及更高版本,您可能想看看新的Memory Mapped Files。
使用 Persisted Memory Mapped 文件可以让您轻松使用文件,但可以加快映射到内存的速度。当然,您仍然必须自己管理文件格式。
- 持久化内存映射文件
持久文件是与磁盘上的源文件相关联的内存映射文件。当最后一个进程完成对文件的处理后,数据将保存到磁盘上的源文件中。这些内存映射文件适用于处理非常大的源文件。
对于 30 个整数来说,这可能有点过分了,但这是另一种选择,尤其是在速度很关键的情况下。
我会选择文件存储并避免使用数据库或注册表作为框架的第一个它需要的第二个......哦,好吧,永远不要玩 Registry :)
使用 XML 作为文件存储,这是一本很好的读物:
您可以创建文件以将所有 ID 保存在同一个节点中,或者为每个节点编写一个 ID,这取决于您,这样就可以了:
<?xml version="1.0" encoding="utf-8" ?>
<settings>
<selected>
<id>1</id>
<id>8</id>
<id>12</id>
<id>15</id>
</selected>
</settings>
为了创建这样的文件:
XmlDocument doc = new XmlDocument();
XmlElement set = (XmlElement)doc.AppendChild(doc.CreateElement("settings"));
XmlElement sel = (XmlElement)set.AppendChild(doc.CreateElement("selected"));
int[] selectedIds = new int[] { 1, 2, 3, 4, 5 };
foreach (int id in selectedIds)
sel.AppendChild(doc.CreateElement("id")).InnerText = id.ToString();
string path = Path.GetDirectoryName(Application.ExecutablePath);
doc.Save(path + "/settings.xml");
为了阅读,您可以使用XmlReader
, XmlTextReader
,XDocument
等...
您可以使用IMemoryCache
和AcroFS
库作为持久性的附加层!
您只需要调用.Persistent()
方法来获取内存缓存的持久实例。
_memoryCache
.Persistent()
.Set(key, value, TimeSpan.FromMinutes(1));
如果您不需要缓存,您可以简单地使用AcroFS
without IMemoryCache
:
var _repository = FileStore.CreateStore();
// store the model with a custpm key
_repository.Store("my-model", MyModel);
// load model
var model = _repository.Load<MyModel>("my-model");