【问题标题】:Store data in C# source files vs. XML etc...?将数据存储在 C# 源文件与 XML 等...?
【发布时间】:2010-10-20 06:18:24
【问题描述】:

这是一个 C# 问题。

如果有人尝试将他们的数据(例如配置文件)存储在 *.cs 文件而不是 XML 中,我只是在徘徊?

我真的很讨厌 XML。每次需要一些数据时都解析类似 html 的结构的整个想法似乎很愚蠢。

是否有 XML 的轻量级替代品(如 YAML)? 在我的情况下,我实际上需要为(游戏)关卡存储一些数据,其中有很多不同的对象、地形类型等......在一个平面文件中,以便我稍后阅读。

我想我可以序列化我的 Level 类,但我希望数据文件可以在任何文本编辑器中进行编辑。

欢迎任何帮助,谢谢!

PS:关于 .cs 文件,我忘了提到我希望能够通过编辑器在游戏中创建(和保存)新关卡。

【问题讨论】:

  • 您是在序列化为 xml 吗?这很简单,根本不需要您了解 xml?您是否使用内置的设置管理器?项目属性 -> 设置 Properties.Settings.Default.yoursetting 非常简单。

标签: c# xml serialization xna yaml


【解决方案1】:

我在游戏行业工作,我们确实几乎只使用 XML 来完成您所描述的工作。
原因如下:
1.很好理解,是标准
2.在库方面有很好的支持
3. 可以验证 - 这在创建数据编辑器时是必不可少的
4. 结构化
5. 它是人类可读的,因此易于调试

您说您讨厌仅仅为了获得一个价值而不得不拖网它的事实向我表明您应该使用那里的众多 xml 解析器之一。相信我,这很容易并且有效

人们使用它是有充分理由的。是的,它确实有它的缺点,即冗长等,但相信我的优点远远超过缺点!

【讨论】:

    【解决方案2】:

    从技术上讲,您不需要解析 XML,只需创建一个数据模型,然后序列化为 XML 并从 XML 反序列化。在 Visual Studio 中为数据模型构建一个编辑器也非常简单,方法是让 TreeView 或 ListView 显示数据模型中的每个项目/对象,并使用 PropertyEditor 编辑所选对象的属性。使用 OpenFileDialog 和 SaveFileDialog 让用户选择 XML 文件和 XmlSerializer 来加载和保存您的数据模型。我向你保证真的无痛! :-)

    【讨论】:

      【解决方案3】:

      我们喜欢 JSON 用于配置文件 - 它的用途非常广泛。

      它易于手动编辑,易于解析和生成(包括强大的 .NET 库 - MS 和 3rd 方),并且非常强大 - 一种具有良好基本数据类型的 XML。

      【讨论】:

      【解决方案4】:

      如果您使用 .NET 配置系统,它会为您进行 XML 解析。见How to: Create Custom Configuration Sections Using ConfigurationSection。即使它位于 ASP.NET 部分,它也适用于所有 .NET 代码。

      【讨论】:

        【解决方案5】:

        听起来您想要一种可以在文本编辑器中编辑的二进制格式。不幸的是(直到每个人都能流利使用十六进制编辑器)在速度和易于编辑之间存在不可避免的权衡。

        由于二进制格式基本上是对您的状态进行编码的最小字节集的非常密集的包装,因此解析起来既快速又容易。另一方面,XML 格式很容易编辑。一种可能的解决方案是创建两者并构建一个在它们之间转换的简单程序。然后,您的高级用户将使用此程序将您的关卡转换为 XML,编辑它们,然后再将它们转换回来。

        如果您最终在这种情况下使用 XML,我建议您使用多个文件,也许每个对象一个。听起来你打算拥有一个复杂的世界。把它切碎一点是有道理的。

        【讨论】:

          【解决方案6】:

          每次需要一些数据时都解析类似 html 的结构的整个想法似乎很愚蠢。

          如果您不打算使用 XML 或 YAML,您将不得不编写自己的解析器和验证器,而现在您已经进入了愚蠢统治的领域。 XML 很烦人,但如果没有用于操作它的工具生态系统,那就更糟了。

          【讨论】:

            【解决方案7】:

            即使被认为相当重的 XML 通常也是在文件中存储数据的最佳选择,而 LINQ for XML 确实使读取和写入该数据变得更加容易。

            如果您的数据变得相当复杂,另一种选择是使用 SQLite 之类的东西,我以前使用过它,对于单用户访问,它确实非常快速且易于使用。

            【讨论】:

              【解决方案8】:

              由于您不想使用 XML,我建议您创建自己的文本可编辑文件格式。

              PROPERTIES
              name = First Level
              number = 1
              END
              
              MONSTERS
              Barbarian
              pos = (3, 6)
              health = 2
              
              Dragon
              pos = (10, 10)
              health = 8
              END
              

              等等,你需要什么。

              自己创建解析器非常简单。几乎只是逐行读取文件。 在第一行,您会看到标题是 PROPERTIES,因此您可以读入属性,直到读入 END 行。对于您拥有的任何其他标题也是如此。有很多方法可以改变这一点,因此您可以按照自己的意愿制作语法。

              【讨论】:

              • 我认为您低估了设计特定领域语言然后为其构建解析器所涉及的工作量大约 1 万亿倍。
              • 没有。我已经为我自己的格式构建了许多解析器,我专门为各种程序制作。我什至为 XML 构建了一个简单的解析器,我一点也不觉得它难。
              • 这取决于您设计的语言的复杂程度。
              • 谢谢,我想我可能会使用这种方法。但我仍然不确定我是否会使用 XML。这取决于我如何解决问题。
              【解决方案9】:

              为什么不 (xml)?

              我没有看到不使用 XML 的案例,特别是考虑到您想在文件中存储不同类型的信息。

              也就是说,对于 .cs 文件方法,我建议构建应用程序代码,以便加载初始化所需数据的代码,而不是在文件中查找数据。它为您提供了一个清晰的模式(编译 + 加载),因为您现在正在加载一个初始化类,而不是在文件中查找数据。尽可能多地添加以使配置尽可能简单。

              【讨论】:

              • 关于 .cs 文件,我忘了提到我希望能够通过编辑器在游戏中创建(和保存)新关卡。
              • 我明白你的意思。您仍然可以拥有一个编辑器,但除非它完全覆盖,否则编辑后配置不会那么干净,即您可以:1)加载现有配置,并保存在编辑器中完成的其他操作,即添加更新/删除/添加到方法底部的配置 2)加载现有配置,在保存时生成一个新配置 - 将删除文件中的任何 cmets,但不会避免重复,因为它可以生成仅添加行。
              【解决方案10】:

              如果您的数据不太复杂或分层,您可以将其存储为如下属性文件格式:

              level.name=My Level
              level.mapfile=Map.txt
              

              等等

              另一方面,XML 在 C# 中通过序列化(ISerializable 或 DataContract)非常容易使用,您不必编写任何解析代码,框架会为您完成所有工作。在文本编辑器中编辑 XML 不会那么糟糕!

              如果您愿意在 XML 上稍作妥协,您可以使用 NameValueCollection 来保存您的配置项。然后,您可以使用内置的 .NET 序列化对其进行序列化。该文件将是 XML,但它是一种非常简单、易于编辑的格式,您不必担心任何手动类型转换/验证。

              【讨论】:

              • 可以。抱歉没有 XML。属性文件是吗?这些有解析器吗?
              • 很容易写一个,如果你对语法不太感兴趣的话。但我同意,手工编辑 XML 是我不太喜欢做的事情。
              【解决方案11】:

              我在游戏行业工作多年,我们使用 XML 是因为它有最好的工具支持。 Yaml 或 Ini 文件用于配置,但游戏数据存储在 XML 中。当然,我们通常拥有将 XML 转换为二进制代码的工具,用于发布游戏,但在开发和自定义游戏工具开发过程中,XML 只是摇摆不定。

              有时 XML 是满足您需求的合适工具,不要仅仅因为技术在某些领域不是最好的(比如 Ajax(传输)与数据定义)就对技术抱有偏见

              【讨论】:

              • 这个。在构建过程中有一个数据导出过程,它解析 xml 并生成一个二进制文件,可以在运行时直接在游戏对象中读取。
              • +1 在游戏行业工作多年,这正是我们所做的。不要 diss XML,它可能很冗长,但它绝对是完成这项工作的最佳工具
              【解决方案12】:

              如果您以前听说过它,请不要怀疑,但您应该看看这个 YAML 东西。非常酷,有its own homepage 和一切。

              【讨论】:

              • 谢谢,我知道怎么用谷歌搜索了。我不知道那个 yaml 库有多可靠。第一个 .NET 库似乎不稳定,第二个正在“进行中”。
              • 别害怕,昏昏沉沉的;无论如何都要使用它,独自一人修复错误。来吧,你知道你想......
              • 我真的不想朝那个方向发展。我正在寻找现成的东西。我对 xml 对所有微软开发人员的统治感到非常惊讶。这就像一个蜂巢......
              【解决方案13】:

              ini 文件?

              [section]
              key=value
              

              在阅读您的问题并仔细考虑之后,XML 在游戏行业中非常标准,因为它的结构、支持子级以及任何文本编辑器都可以手动编辑。

              想到的一些使用 XML 文件的游戏:

              魔兽世界
              孤岛危机
              命令与征服 3

              【讨论】:

              • 谢谢,但没有 xml。 ini 也是 yaml 的劣质版本。我必须自己解析、验证等。
              • 不,你不知道:请参阅 GetPrivateProfileXxx API。但你说得对,他们的能力非常有限。
              猜你喜欢
              • 1970-01-01
              • 2013-06-07
              • 1970-01-01
              • 2012-12-24
              • 2019-01-16
              • 2012-07-28
              • 2015-12-31
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多