2

这是一个 C# 问题。

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

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

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

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

欢迎任何帮助,谢谢!

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

4

13 回答 13

3

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

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

于 2009-04-18T05:44:18.160 回答
2

为什么不(xml)?

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

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

于 2009-04-18T06:11:07.300 回答
2

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

PROPERTIES
name = First Level
number = 1
END

MONSTERS
Barbarian
pos = (3, 6)
health = 2

Dragon
pos = (10, 10)
health = 8
END

依此类推,以获取您需要的任何其他内容。

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

于 2009-04-18T06:37:39.687 回答
1

ini 文件?

[section]
key=value

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

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

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

于 2009-04-18T05:31:49.390 回答
1

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

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

于 2009-04-18T08:22:19.043 回答
1

我们喜欢 JSON 作为配置文件——它的用途非常广泛。

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

于 2009-06-04T13:19:30.687 回答
0

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

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

等等

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

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

于 2009-04-18T05:34:17.590 回答
0

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

于 2009-04-18T05:39:57.267 回答
0

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

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

于 2009-04-18T08:07:40.343 回答
0

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

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

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

于 2009-04-19T14:48:10.560 回答
0

如果您使用 .NET 配置系统,它会为您进行 XML 解析。请参阅如何:使用 ConfigurationSection 创建自定义配置部分。即使它位于 ASP.NET 部分中,它也适用于所有 .NET 代码。

于 2009-04-19T15:04:10.647 回答
0

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

于 2009-06-28T17:12:25.600 回答
0

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

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

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

于 2009-06-28T17:31:31.347 回答