代码之家  ›  专栏  ›  技术社区  ›  Kornel Kisielewicz

数据存储的Lua与XML

  •  17
  • Kornel Kisielewicz  · 技术社区  · 15 年前

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

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

    然而,当我了解到使用Lua处理数据是多么的好和容易(尤其是让Luabind支持您!),我开始怀疑是否有任何理由使用XML来存储游戏数据,如果我们已经使用了Lua?

    在使用Lua编写UI脚本时,暴雪仍然以XML形式存储布局。是因为某些东西只与用户界面相关吗?

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

    9 回复  |  直到 14 年前
        1
  •  11
  •   Maiku Mori    15 年前

    这也许不是你所期望的答案,但它可能会帮助你做出决定。

    暴雪(wow)使用XML定义用户界面。它有点像C中的XAML,只是功能要弱得多,大多数插件只使用XML来引导插件,然后用Lua代码构建UI。

    阿尔索 wow实际上将加载项“保存的变量”存储在.lua文件中。 .

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

    XML的好处在于,已经有很多工具和代码被编写来测试、编写和解析XML,这意味着它可以节省您一些时间。例如 XML Schema s对于验证用户编写的文件非常有用(安全性只是一个副作用,好的是,如果它通过了您的模式,数据很可能100%安全,并准备好插入到您的引擎中),并且已经有相当多的验证器编写给您使用。

    另外,一些用户对XML文件感到害怕(即使它们可读性很强,也可能可读性太强),他们更喜欢“简单”的文件。如果只是为了存储(而不是配置),那么在大多数情况下,没有人会编辑这些文件。XML还将占用比LuaVar转储更多的空间(不重要,除非您有大量数据)。

    我认为你在这里是不会出错的。暴雪正在使用Lua进行存储,我非常喜欢它的工作方式。

        2
  •  15
  •   Kornel Kisielewicz    14 年前

    感谢您迄今为止的回答!我冒昧地总结一下要点,以备将来参考。

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

    1. 传输数据和存储数据时的安全性,尤其是从未知源接收数据时的安全性
    2. 可移植性,并易于通过其他工具访问数据
    3. 不太有用的现有工具,如XML模式验证器
    4. 对分析数据的支持更少
    5. 循环引用的问题
    6. 限制更少——更难执行适当的约定、用法和设计

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

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

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

        3
  •  8
  •   Norman Ramsey    15 年前

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

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

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

    • 如果有包含循环引用的Lua表,例如, t1.next == t2 t2.prev = t1 然后,将Lua结构写入磁盘的过程变得单调乏味,结果Lua比简单的Lua更难读取。 return <list of big expressions here> .(我从未遇到过这种情况,如果您的数据可以用XML表示,那么您不会遇到这种情况。)

    • 如果你有 许多 例如,如果您正在编写整个Information 7手册的反向索引,那么您可以对一个块中可能出现的不同常量的数量运行违反Lua的限制。然后,您必须将事情分成多个块或函数,或者求助于其他解决方案。这个问题 咬了我,这是一个巨大的痛苦。我想写一个通用的解决方案,但我不是100%的固体,我明白的约束,我还没有解决它。

      如果数据的数字和字符串文本少于100000个,则无需担心此问题。

        4
  •  5
  •   Breton    15 年前

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

    您可能能够在您的团队中强制执行这样的规则,但是对于用户来说,这可能会被利用。接下来,您决定更改数据格式,而这些用户扩展不可移植,因为它们包括非数据的Lua!

    这样的实体更难大规模地进行编程操作。

    还有其他所有的问题都来自于没有恰当地分离关注点。如果您允许您的数据和代码混合,那么它们可能仍然可以工作,但是越混乱,就越难以解释。

        5
  •  5
  •   Brian Campbell Dennis Williamson    15 年前

    我会说最大的缺点是其他工具很难操纵这些数据。如果您将数据直接存储在Lua中,那么您需要编写一个Lua解析器,以便在每个环境都有XML解析器和生成器的情况下自动操作这些数据。这不仅仅是其他语言的工具的问题;如果您想编写一个用于编辑配置的图形用户界面,您是否有能够以不影响在版本控制系统中合并的方式分析、修改和写出配置数据的工具?对于有很多人同时编辑配置的大型项目来说,这一点很重要。

    也就是说,同样的想法导致了 JSON ,它是用作数据格式的javascript的子集。但是目前有很多支持JSON的工具,可能不太多支持Lua的语法。

    当您的代码是您的配置时,偶尔会出现另一个问题,那就是人们开始编写代码来生成配置,或者向配置文件添加抽象。然后,任何想要定制你的程序的用户都会变得困惑,不得不学习如何编程和整个编程语言,而不是相对简单的配置语言。

        6
  •  3
  •   Breton    15 年前

    如果Lua脚本是用户可访问的,那么必须强制执行用于数据规范的Lua子集,否则您所拥有的不仅仅是数据语言,而是安全漏洞。实现这样一个子集的问题并不简单。

    你知道JSON吗?这可能更像是你想要的。

    这里有两个实现: http://json.luaforge.net/

    这里 http://www.chipmunkav.com/downloads/Json.lua

    如果JSON不够强大,另一个选项是Yaml,它是JSON的超集,不过我不能告诉您Lua中是否有合适的JSON实现。

        7
  •  3
  •   Armentage    15 年前

    记住,LuaVM和语言非常灵活。您可以使用函数环境来实现您想要的任何形式的安全,然后使用策略来避免运行“恶意”代码。简单地从你的环境中消除一切 加载字符串() 你的数据和你的“数据”能做的唯一危险的事情就是运行一个循环并烧掉CPU。

    另一件要记住的事情是,您总是可以将Lua表转换为XML,反之亦然,尽管元素和属性映射到Lua表上会导致表中出现一些奇怪的模式。

        8
  •  2
  •   sylvanaar    15 年前

    我已经完成了一些使用Lua作为数据存储/配置语言的项目。

    决定使用它的关键因素是“我们是否已经在那个项目上使用了Lua?”

    另一件事是它可以移植到任何可以编译Lua解释器的地方。在所有平台上都是一样的-没有特殊的XML库

    JSON是一个很好的选择。

    目前我使用XML的唯一方法是为序列化程序使用带注释的代码gen,例如.NET XML或JAXB)。

        9
  •  1
  •   Vijay Mathew Chor-ming Lung    15 年前

    我通常远离XML,主要是因为它冗长。大多数时候,我使用CSV或SQLite进行数据存储。我使用脚本语言(如Lua、Python或Scheme)为用户提供扩展软件的接口。