我们中的许多人都被灌输使用XML来存储数据.它的好处和缺点是众所周知的,我当然不想在这里讨论它们.但是在我用C++编写的项目中,我也使用了Lua.我很惊讶Lua可以用来存储和处理数据.然而,至少在游戏编程世界中,Lua的这一方面不太被认可.
我知道XML在诸如通过互联网发送数据的情况下以及在安全起作用的地方(例如使用从网络下载的数据,或加载用户可编辑的配置文件)以及最后的情况下具有优势.不同语言的程序正在读取相同的数据.
然而,一旦我学会了使用Lua处理数据是多么好和容易(特别是让luabind支持你!),我开始怀疑是否有任何理由使用XML来存储游戏数据,如果我们已经使用了Lua呢?
暴雪在使用Lua编写UI脚本时,仍然以XML格式存储布局.是什么原因只有UI相关?
使用Lua作为数据存储语言有什么缺点?
Kor*_*icz 15
到目前为止,谢谢你的答案!我将冒昧地总结这些要点以供将来参考.
与XML相比,使用Lua存储数据的缺点
与XML相比,使用Lua存储数据的好处
如果我错过了第一个列表中的内容,请指出!
Mai*_*ori 11
这可能不是您期望的那种答案,但它可能有助于您做出决定.
暴雪(WoW)使用XML来定义UI.它有点像C#中的XAML,功能强大得多,大多数插件只是使用XML来引导插件然后在lua代码中构建UI.
另外WoW实际上在.lua文件中存储插件"已保存的变量".
在我看来,它并没有那么多.选择你喜欢的东西,这对于那些想要扩展引擎的人来说很容易使用.
关于XML的好处是,已经编写了大量用于测试,编写和解析XML的工具和代码,这意味着它可以为您节省一些时间.例如,XML Schema对于验证用户编写的文件非常有用(安全性只是副作用,好处是如果它通过您的架构,数据很可能100%安全并准备好插入您的引擎)并且已经为您编写了相当多的验证器.
然后,一些用户再次害怕XML文件(尽管它们非常易读,可能太可读)并且更喜欢"更简单"的东西.如果它只是用于存储(而不是配置),那么在大多数情况下无论如何都没有人会编辑这些文件.XML也将占用更多空间,然后是lua var dump(无论如何,除非你有大量数据).
我认为你不会在这里出错.暴雪正在使用lua进行存储,我非常喜欢它的工作原理.
Lua是存储数据的主要胜利.方便,快捷,可轻松转换为其他需要的格式.(可转换性假设您的数据可以用其他格式表示,如果它可以用XML表示,那么它将是.)
使用Lua作为数据存储语言有什么缺点?
我知道两个缺点,其重要性取决于您的应用:
如果你有包含循环引用的Lua表,例如,t1.next == t2和t2.prev = t1,那么将Lua结构写入磁盘的过程变得乏味,并且生成的Lua比简单的更难阅读return <list of big expressions here>.(这从来没有发生在我身上,如果你的数据可用XML表示,那么你就不会发生这种情况.)
如果您有大量数据 - 例如,如果您正在编写整个Inform 7手册的反向索引 - 那么您可能会对可能出现在块中的不同常量的数量违反Lua的限制.然后,您必须将事物拆分为多个块或函数,或采用其他解决方案.这个问题让我感到困惑,这对屁股来说是一个巨大的痛苦.我想写一个通用的解决方案,但我不是100%坚实我理解约束,我还没有解决它.
如果您的数据少于100,000个数字和字符串文字,则不必担心此问题.
我认为最大的缺点是其他工具更难操纵数据.如果将数据直接存储在Lua中,那么您需要编写Lua解析器以自动操作该数据,而每个环境都有XML解析器和生成器.这对于其他语言的工具来说不是问题; 如果您想编写用于编辑配置的GUI,您是否有能够以不影响版本控制系统中的合并的方式解析,修改和写出配置数据的工具?这对于那些可能同时编辑配置的大型项目来说非常重要.
也就是说,同样的想法是导致JSON的原因,JSON是用作数据格式的JavaScript的子集.但目前有很多工具支持JSON,可能并不是很多支持Lua语法的工具.
当您的代码成为您的配置时,偶尔出现的另一个问题是人们开始编写代码来生成配置,或者在配置文件中添加抽象.然后,任何可能想要自定义程序的用户都会感到困惑,不得不学习如何编程和编程语言而不是相对简单的配置语言.
如果不是安全,那么考虑纪律.如果数据文件中提供了完整范围的LUA,则可能仍会向数据文件添加逻辑或行为.拥有数据和行为的这些实体可能会使大型项目的管理变得复杂:假设您构建了一个游戏引擎和整个游戏.现在您要删除所有特定内容,重复使用游戏引擎制作新游戏.如果内容/数据被安全地从行为中分割出来,那么这是相当简单的.如果在一个弱点时刻,你决定有一天问题的最佳解决方案是将函数存储为数据,那么事情就会变得有些奇怪.
您可能能够在团队中强制执行此类规则,但是对于用户而言,它可能会受到攻击.然后你决定改变数据格式,那些用户扩展不可移植,因为它们包含不是数据的lua!
这些实体更难以大规模编程操作.
还有其他问题来自于没有正确分离问题.如果你允许你的数据和代码混合,那么它们可能仍然可以工作,但是越是纠结的事情,他们就越难以推理.