Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Lua与XML用于数据存储_C++_Xml_Lua - Fatal编程技术网

C++ Lua与XML用于数据存储

C++ Lua与XML用于数据存储,c++,xml,lua,C++,Xml,Lua,我们中的许多人都被灌输了使用XML存储数据的思想。它的优点和缺点是众所周知的,我当然不想在这里讨论它们。然而,在我写的C++项目中,我也使用了Lua。我非常惊讶Lua在存储和处理数据方面的表现。然而,Lua的这一方面不太被认可,至少在游戏编程界是如此 我知道XML在通过internet发送数据、在安全性发挥作用的地方(例如使用从网络下载的数据或加载用户可编辑的配置文件)以及最后在不同语言的程序读取相同数据的情况下都有它的优势 然而,当我了解到使用Lua处理数据是多么的容易(特别是有luabind

我们中的许多人都被灌输了使用XML存储数据的思想。它的优点和缺点是众所周知的,我当然不想在这里讨论它们。然而,在我写的C++项目中,我也使用了Lua。我非常惊讶Lua在存储和处理数据方面的表现。然而,Lua的这一方面不太被认可,至少在游戏编程界是如此

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

然而,当我了解到使用Lua处理数据是多么的容易(特别是有luabind来支持你!)时,我开始怀疑,如果我们已经使用Lua,是否有任何理由使用XML来存储游戏数据

暴雪虽然使用Lua编写UI脚本,但仍将布局存储在XML中。原因是否与UI相关


使用Lua作为数据存储语言有哪些缺点?

我通常不使用XML,主要是因为它太冗长。大多数情况下,我使用CSV或SQLite进行数据存储。我使用Lua、Python或Scheme等脚本语言为用户提供扩展软件的界面。

如果Lua脚本可由用户访问,则必须强制执行用于数据规范的Lua子集,否则您拥有的不仅仅是数据语言,而是安全漏洞。强制执行这样一个子集的问题并非微不足道

你知道json吗?那可能更像是你想要的那种东西

这里有两种实现:

这里呢


如果json不够强大,另一个选择是YAML,一个json的超集,尽管我不能告诉你在Lua中是否有任何合适的实现。

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

这就是说,同样的想法也产生了,它是用作数据格式的JavaScript的一个子集。但目前有很多工具支持JSON,支持Lua语法的工具可能不多


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

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

您可能能够在您的团队中实施这样的纪律,但对于用户来说,这可能会被利用。接下来,您决定更改数据格式,而这些用户扩展是不可移植的,因为它们包括lua,而lua不是数据

这样的实体更难在大规模上以编程方式操作


还有其他所有的问题都是由于没有恰当地将关注点分开而引起的。如果您允许数据和代码混合使用,这一切可能仍然有效,但事情越复杂,就越难以推理。

Lua是存储数据的一大胜利。方便、快速,并可根据需要轻松转换为其他格式。(可转换性假设您的数据可以用其他格式表示,如果数据可以用XML表示,那么它就是。)

使用Lua作为数据存储语言有哪些缺点

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

  • 如果有包含循环引用的Lua表,例如
    t1.next==t2
    t2.prev=t1
    ,那么将Lua结构写入磁盘的过程将变得单调乏味,产生的Lua比简单的
    返回更难读取。(这种情况从未发生在我身上,如果您的数据可以用XML表示,那么这种情况就不会发生在您身上。)

  • 如果您有大量数据,例如,如果您正在编写整个Inform 7手册的反向索引,那么您可能会违反Lua对块中可能出现的不同常量数量的限制。然后,您必须将事情拆分为多个块或函数,或者求助于其他解决方案。这个问题一直困扰着我,这是一个巨大的痛苦。我想写一个通用的解决方案,但我不是100%可靠我了解约束,我还没有解决它

    如果数据中的数字和字符串文本少于100000个,则不必担心此问题

    • 这可能