【问题标题】:Is it better to save data in an XML or a database?将数据保存在 XML 或数据库中更好吗?
【发布时间】:2013-03-05 05:44:44
【问题描述】:

我们开发了一款航空模拟游戏,我们目前的结构将用户数据保存在一个 XML 文件中(以及所有游戏数据,如机场统计数据、飞机信息等)。

在性能和功能方面,将这些数据存储在本地计算机上的最佳方式是什么?我听到了双方的一些声音,但没有真正的具体或示例支持的答案。虽然我们的原始数据 XML 更小(

想法、建议或建议?

【问题讨论】:

  • 您多久加载/保存一次数据?在游戏过程中它有多重要?如果只是在启动和特定保存期间,它可能并不重要。
  • 您是否需要真正查询它,或者您真的只是保存和加载整个内容?
  • 专门用于加载和保存游戏。目前我们似乎被计算游戏信息的性能问题所困扰,所以为了减少保存时间,我们可能会尝试做一种增量自动保存,添加在创建保存文件时将保持静态的信息。
  • 曾经玩过游戏,然后浏览到游戏文件夹并查看您所有的人保存数据等吗?大多数专业游戏公司似乎都采用“保存到文件”的方法。你有没有看过其他类似的游戏,看看他们做了什么?只是一个想法。
  • 我看过其他游戏(虽然不是最近)。我见过不少使用专有格式来保存游戏的游戏,但我不确定在我们的案例中性能优势是否可以证明这一点。

标签: c# wpf simulation .net-4.5


【解决方案1】:

如果您不需要手动编辑文件,您可以尝试使用 BinaryFormatter 来序列化和反序列化您的数据,应该比 XmlSerializer 快很多。

这是一个如何使用它的示例。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication2
{
    [Serializable()]
    public class Child
    {
        public string Property1 { get; set; }
    }

    [Serializable()]
    public class TestClass
    {

        public int Property1 { get; set; }
        public string Property2 { get; set; }
        public DateTime Property3 { get; set; }
        public Child Child { get; set; }
    }


    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            TestClass testClass = new TestClass()
            {
                Property1 = 1,
                Property2 = "test",
                Property3 = DateTime.Now,
                Child = new Child()
                {
                     Property1 = "test", 
                }
            };

            System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            System.IO.MemoryStream memoryStream = new System.IO.MemoryStream();
            formatter.Serialize(memoryStream, testClass);

            memoryStream.Position = 0;
            TestClass deserialized = formatter.Deserialize(memoryStream) as TestClass;
        }
    }
}

【讨论】:

  • 我最喜欢这个。您可以将其与 GZipStream 结合使用以压缩输出,我敢打赌,对于大型游戏保存,它会变得更小。
  • 显然我们过去曾尝试过,但在序列化包含其他对象的对象时遇到了问题。有什么智慧之词/指向引用该内容的链接吗?快速的谷歌搜索没有显示任何非常有用的东西
  • 应该可以正常工作,我已更新示例以显示包含另一个对象的对象。
【解决方案2】:

如果您将数据保存在 XML 文件中,请考虑使用 XML 数据库,例如 Oracle BerkleyDB XML/BaseX/Sedna。您可以使用 DB API 进行数据操作,也可以使用 XQuery 查询该 XML。 Berkley DB XML 数据库性能良好。

此外,如果您的用户数据、机场统计数据等具有可以逐行变化的信息,您也应该使用 XML 数据库。

如果您的数据模型结构良好,那么您可以使用 MySql 或 PostGreSql 等开源数据库来处理您的所有数据。

在这里,两者都可以正常使用您预期的数据库大小以进行数据添加/更新。您应该考虑您的数据模型来选择数据存储库类型。

如果您选择 XML 数据库,您的数据访问/保存代码可能会被重复使用。

如果您选择 RDBMS,您应该为您的应用层编写代码。

希望这种见解和进一步的研究对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 2014-08-12
    • 1970-01-01
    相关资源
    最近更新 更多