Lua vs. XML用于数据存储

Kor*_*icz 18 c++ xml lua

我们中的许多人都被灌输使用XML来存储数据.它的好处和缺点是众所周知的,我当然不想在这里讨论它们.但是在我用C++编写的项目中,我也使用了Lua.我很惊讶Lua可以用来存储和处理数据.然而,至少在游戏编程世界中,Lua的这一方面不太被认可.

我知道XML在诸如通过互联网发送数据的情况下以及在安全起作用的地方(例如使用从网络下载的数据,或加载用户可编辑的配置文件)以及最后的情况下具有优势.不同语言的程序正在读取相同的数据.

然而,一旦我学会了使用Lua处理数据是多么好和容易(特别是让luabind支持你!),我开始怀疑是否有任何理由使用XML来存储游戏数据,如果我们已经使用了Lua呢?

暴雪在使用Lua编写UI脚本时,仍然以XML格式存储布局.是什么原因只有UI相关?

使用Lua作为数据存储语言有什么缺点?

Kor*_*icz 15

到目前为止,谢谢你的答案!我将冒昧地总结这些要点以供将来参考.

与XML相比,使用Lua存储数据的缺点

  1. 传输数据和存储数据时的安全性,尤其是在从未知来源接收数据时
  2. 可移植性,以及通过其他工具轻松访问数据
  3. 不太有用的现有工具,如XML Schema验证器
  4. 对解析数据的支持较少
  5. 循环引用的问题
  6. 限制性较低 - 难以执行适当的约定,使用和设计

与XML相比,使用Lua存储数据的好处

  1. 对脚本和数据使用单一语言(不需要单独的文件,加载时不需要特殊情况)
  2. 由于使用单一语言而减少了代码和依赖性
  3. 更加冗长和(可以说)更具人性化
  4. 更加灵活,可扩展(毕竟它是一种编程语言)
  5. 数据被"执行",并且可以在需要时访问,因为它位于虚拟机中
  6. 占用较少的空间,尤其是在编译为字节码时

如果我错过了第一个列表中的内容,请指出!


Mai*_*ori 11

这可能不是您期望的那种答案,但它可能有助于您做出决定.

暴雪(WoW)使用XML来定义UI.它有点像C#中的XAML,功能强大得多,大多数插件只是使用XML来引导插件然后在lua代码中构建UI.

另外WoW实际上在.lua文件中存储插件"已保存的变量".

在我看来,它并没有那么多.选择你喜欢的东西,这对于那些想要扩展引擎的人来说很容易使用.

关于XML的好处是,已经编写了大量用于测试,编写和解析XML的工具和代码,这意味着它可以为您节省一些时间.例如,XML Schema对于验证用户编写的文件非常有用(安全性只是副作用,好处是如果它通过您的架构,数据很可能100%安全并准备好插入您的引擎)并且已经为您编写了相当多的验证器.

然后,一些用户再次害怕XML文件(尽管它们非常易读,可能太可读)并且更喜欢"更简单"的东西.如果它只是用于存储(而不是配置),那么在大多数情况下无论如何都没有人会编辑这些文件.XML也将占用更多空间,然后是lua var dump(无论如何,除非你有大量数据).

我认为你不会在这里出错.暴雪正在使用lua进行存储,我非常喜欢它的工作原理.

  • 为了澄清这一点:暴雪将XML用于源自外部工具的文件.当游戏持久保存自己的数据时,为了自己的消费,最好以游戏引擎原生的格式存储数据. (5认同)

Nor*_*sey 8

Lua是存储数据的主要胜利.方便,快捷,可轻松转换为其他需要的格式.(可转换性假设您的数据可以用其他格式表示,如果它可以用XML表示,那么它将是.)

使用Lua作为数据存储语言有什么缺点?

我知道两个缺点,其重要性取决于您的应用:

  • 如果你有包含循环引用的Lua表,例如,t1.next == t2t2.prev = t1,那么将Lua结构写入磁盘的过程变得乏味,并且生成的Lua比简单的更难阅读return <list of big expressions here>.(这从来没有发生在我身上,如果你的数据可用XML表示,那么你就不会发生这种情况.)

  • 如果您有大量数据 - 例如,如果您正在编写整个Inform 7手册的反向索引 - 那么您可能会对可能出现在块中的不同常量的数量违反Lua的限制.然后,您必须将事物拆分为多个块或函数,或采用其他解决方案.这个问题我感到困惑,这对屁股来说是一个巨大的痛苦.我想写一个通用的解决方案,但我不是100%坚实我理解约束,我还没有解决它.

    如果您的数据少于100,000个数字和字符串文字,则不必担心此问题.


Bri*_*ell 5

我认为最大的缺点是其他工具更难操纵数据.如果将数据直接存储在Lua中,那么您需要编写Lua解析器以自动操作该数据,而每个环境都有XML解析器和生成器.这对于其他语言的工具来说不是问题; 如果您想编写用于编辑配置的GUI,您是否有能够以不影响版本控制系统中的合并的方式解析,修改和写出配置数据的工具?这对于那些可能同时编辑配置的大型项目来说非常重要.

也就是说,同样的想法是导致JSON的原因,JSON是用作数据格式的JavaScript的子集.但目前有很多工具支持JSON,可能并不是很多支持Lua语法的工具.

当您的代码成为您的配置时,偶尔出现的另一个问题是人们开始编写代码来生成配置,或者在配置文件中添加抽象.然后,任何可能想要自定义程序的用户都会感到困惑,不得不学习如何编程和编程语言而不是相对简单的配置语言.

  • Lua解析自己,它是最好的工具:> - 检查这里的例子:http://www.lua.org/pil/12.html考虑到他们需要编写已经在引擎中的Lua脚本,在这种情况下,最后一个参数无效 - 尤其是基于lua的数据文件看起来比XML文件更加用户友好. (3认同)

Bre*_*ton 5

如果不是安全,那么考虑纪律.如果数据文件中提供了完整范围的LUA,则可能仍会向数据文件添加逻辑或行为.拥有数据和行为的这些实体可能会使大型项目的管理变得复杂:假设您构建了一个游戏引擎和整个游戏.现在您要删除所有特定内容,重复使用游戏引擎制作新游戏.如果内容/数据被安全地从行为中分割出来,那么这是相当简单的.如果在一个弱点时刻,你决定有一天问题的最佳解决方案是将函数存储为数据,那么事情就会变得有些奇怪.

您可能能够在团队中强制执行此类规则,但是对于用户而言,它可能会受到攻击.然后你决定改变数据格式,那些用户扩展不可移植,因为它们包含不是数据的lua!

这些实体更难以大规模编程操作.

还有其他问题来自于没有正确分离问题.如果你允许你的数据和代码混合,那么它们可能仍然可以工作,但是越是纠结的事情,他们就越难以推理.