存储来自 C# 应用程序的数据

Posted

技术标签:

【中文标题】存储来自 C# 应用程序的数据【英文标题】:Store data from a C# application 【发布时间】:2010-09-06 09:51:59 【问题描述】:

我最近开始学习一些 C# 并编写了一个 Yahtzee 克隆。我的下一步(现在游戏逻辑已经到位并正常运行)是整合一些方法来保持所有游戏的统计数据。

我的问题是,我应该如何存储这些信息?我的第一个想法是使用数据库,我觉得这就是我会得到的答案......如果是这样的话,你能给我指出一个从 C# 应用程序创建和访问数据库的好资源吗?


存储在 XML 文件中实际上对我来说更有意义,但我想如果我建议我会被撕裂;)。我习惯于构建 Web 应用程序,对于那些,文本文件通常不受欢迎。

那么,对于 XML 文件,我应该查看哪些类以便于操作?

【问题讨论】:

【参考方案1】:

这里有一个想法:使用 Xml 序列化。设计您的 GameStats 数据结构,并根据需要使用 Xml 属性来影响架构。我喜欢将这种方法用于小型数据集,因为它快速简单,我需要做的就是设计和操作数据结构。


using (FileStream fs = new FileStream(....))

    // Read in stats
    XmlSerializer xs = new XmlSerializer(typeof(GameStats));
    GameStats stats = (GameStats)xs.Deserialize(fs);

    // Manipulate stats here ...

    // Write out game stats
    XmlSerializer xs = new XmlSerializer(typeof(GameStats));
    xs.Serialize(fs, stats);

    fs.Close();

【讨论】:

【参考方案2】:

对于这样的事情,数据库可能有点过头了 - 首先将您的信息存储在 XML 文档(或一系列 XML 文档,如果有大量数据)中。你得到了所有漂亮的 XCopy 部署东西,你仍然可以使用 LINQ,如果你后来决定你真的需要高性能的关系查询逻辑,这将是一个平稳的过渡到数据库。

【讨论】:

【参考方案3】:

数据库可能是多余的 - 您是否考虑过将分数存储在文件中?

如果您决定使用数据库,您可以考虑使用SQLite,您可以像分发文件一样分发它。有一个开源 .NET 提供程序 - System.Data.SQLite - 包括您开始使用所需的一切。

在 .NET 中访问和读取数据库非常简单 - 请查看 this question 以获取示例代码。

【讨论】:

【参考方案4】:

来自 MS 的SQL Express 是他们 SQL Server 数据库的免费、轻量级版本。如果你走 DB 路线,你可以试试。

或者,您可以简单地在应用程序中创建数据集并将它们序列化为 xml,或者您可以使用 .NET 3.5 SP1 附带的新创建的 Entity Framework 之类的东西

【讨论】:

【参考方案5】:

我不知道数据库是否一定是您想要的。对于像这样的简单游戏存储统计数据,这可能有点过头了。数据库很好;但是您不应该在每种情况下都自动使用一个(我假设这是一个客户端应用程序,而不是在线游戏)。

就个人而言,对于仅存在于用户计算机上的游戏,我只会将统计信息存储在一个文件中(XML 或二进制文件 - 选择取决于您是否希望它是人类可读的)。

【讨论】:

【参考方案6】:

我建议将您的数据保存在简单的 POCO 中,然后将它们序列化为 xml 或二进制文件,就像 Brian 上面所做的那样。

如果您对数据库感兴趣,我建议您使用Sql Server Compact Edition 或VistaDB。两者都托管在您的应用程序中。

【讨论】:

【参考方案7】:

我建议只使用数据库。我建议使用 LINQ 或 ORM 工具与数据库进行交互。为了学习 LINQ,我会看看 Scott Guthrie 的帖子。我认为总共有9个。我在下面链接了第 1 部分。如果您想使用 ORM 工具,例如 nhibernate,那么我建议您查看 Summer of nHibernate 截屏视频。它们是非常好的 nhibernate 学习资源。

我不同意使用 XML。通过报告大量数据的统计信息,您无法使用关系数据库。是的,XML 是轻量级的,但是轻量级关系数据库也有很多选择,除了使用基于服务的完整实现。 (即SQL Server Compact、SQLite 等...)

Scott Guthrie on LINQ Summer of nHibernate

【讨论】:

不知道为什么你的投票被否决了这么多。在这种情况下,我自己不会去数据库(即使是你描述的轻量级数据库),但你的观点是有效的,有一天原始发帖人可能已经在他的统计数据中添加了足够多的内容,使数据库成为更可用的选项( +1 尝试取消谴责)【参考方案8】:

您可以使用System::Xml 命名空间或System::Data 命名空间。第一个为您提供原始 XML,后者为您提供一个方便的 XML 包装器。

【讨论】:

【参考方案9】:

对于这种情况,很好的建模 Stats 类上的 [Serializable] 属性和 XmlSerializer 是要走的路,IMO。

【讨论】:

以上是关于存储来自 C# 应用程序的数据的主要内容,如果未能解决你的问题,请参考以下文章

C# 保持哈希盐的安全,即使是来自开发人员

来自外部应用程序的 Access 数据库中日期字段的月份名称(C#)

如何在 C# 中测试来自 Oracle 的参数

从存储在 MYSQL 中的 C# 生成唯一 ID

来自运行时数据层的 C# 中的动态 odata 服务

C# WebForm内置对象2+Repeater的Command