将数据保存在XML或数据库中会更好吗?

问题描述:

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

性能和功能方面,在本地计算机上存储此数据的最佳方式是什么?我听到了双方的一些,但没有真正的具体或实例支持的答案。虽然我们的原始数据XML较小(< 150KB),但保存的游戏非常大(3-10MB),并且跨越数千行或多或少的无组织数据。

想法,建议或建议?

+1

您多长时间一次加载/保存数据?在游戏过程中它有多重要?如果只是在启动和特定保存期间,它可能并不重要。 – Oded 2013-03-16 14:41:19

+0

你是否真的需要实际*查询*,或者你真的只是保存和加载整个事情? – 2013-03-16 14:41:39

+0

专用将用于加载和保存游戏。我们似乎在计算游戏信息时遇到了性能问题,因此为了减少保存时间,我们可能会尝试执行一种增量自动保存,在保存文件创建时添加对保存文件保持静态的信息。 – mikedugan 2013-03-16 14:44:12

如果你不需要手工编辑文件,你可以尝试使用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; 
     } 
    } 
} 
+0

我最喜欢这个。你可以将它与GZipStream结合起来压缩输出,我敢打赌它会使它在保存大型游戏时变得非常小。 – 2013-03-16 15:04:19

+0

显然我们已经在过去试过这个,但是在序列化包含其他对象的对象时遇到了一个问题。任何智慧的话/链接到内容引用的?快速谷歌搜索没有显示任何令人难以置信的有用 – mikedugan 2013-03-16 15:43:37

+0

应该正常工作,我已更新示例以显示包含另一个对象的对象。 – Andy 2013-03-16 16:02:51

如果您将数据保存为XML文件,那么请考虑一个XML数据库,就像Oracle BerkleyDB XML/BaseX/Sedna一样。您可以使用DB API进行数据操作,也可以使用XQuery来查询该XML。 Berkley DB XML数据库性能良好。

如果您的用户数据,机场统计数据等信息可能因行而异,您还应该使用XML数据库。

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

在这里,两者都可以很好地处理数据添加/更新所需的数据库大小。您应该考虑选择数据存储库类型的数据模型。

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

如果您选择RDBMS,则应该为您的应用程序层编码。

希望,这种洞察力和进一步的研究将帮助你。