![]() |
1
11
这也许不是你所期望的答案,但它可能会帮助你做出决定。 暴雪(wow)使用XML定义用户界面。它有点像C中的XAML,只是功能要弱得多,大多数插件只使用XML来引导插件,然后用Lua代码构建UI。 阿尔索 wow实际上将加载项“保存的变量”存储在.lua文件中。 . 在我看来,它没有那么重要。选择一些你喜欢的东西,对于那些想要扩展你的引擎的人来说是很容易使用的。 XML的好处在于,已经有很多工具和代码被编写来测试、编写和解析XML,这意味着它可以节省您一些时间。例如 XML Schema s对于验证用户编写的文件非常有用(安全性只是一个副作用,好的是,如果它通过了您的模式,数据很可能100%安全,并准备好插入到您的引擎中),并且已经有相当多的验证器编写给您使用。 另外,一些用户对XML文件感到害怕(即使它们可读性很强,也可能可读性太强),他们更喜欢“简单”的文件。如果只是为了存储(而不是配置),那么在大多数情况下,没有人会编辑这些文件。XML还将占用比LuaVar转储更多的空间(不重要,除非您有大量数据)。 我认为你在这里是不会出错的。暴雪正在使用Lua进行存储,我非常喜欢它的工作方式。 |
![]() |
2
15
感谢您迄今为止的回答!我冒昧地总结一下要点,以备将来参考。 与XML相比,使用Lua存储数据的缺点
与XML相比,使用Lua存储数据的好处
如果我遗漏了第一个列表中的内容,请指出! |
![]() |
3
8
Lua是存储数据的一大胜利。方便、快速,并且在需要时可轻松转换为其他格式。(可转换性假设您的数据是 可表示的 在其他格式中,如果它可以用XML表示,它将是。)
我知道 两个缺点 ,其重要性取决于您的申请:
|
![]() |
4
5
如果不安全,那么考虑纪律。如果一个数据文件中有完整的Lua范围,那么在数据文件中添加逻辑或行为的可能性仍然存在。拥有这些既是数据又是行为的实体会使大型项目的管理复杂化:例如,假设您构建了一个游戏引擎和一个完整的游戏。现在,您需要去掉所有特定的内容,重新使用游戏引擎来制作新的游戏。如果内容/数据与行为安全地分区,那么这相当简单。如果有一天,在一个脆弱的时刻,你决定将一个函数存储为数据是解决问题的最佳方法,那么事情就会变得有点奇怪。 您可能能够在您的团队中强制执行这样的规则,但是对于用户来说,这可能会被利用。接下来,您决定更改数据格式,而这些用户扩展不可移植,因为它们包括非数据的Lua! 这样的实体更难大规模地进行编程操作。 还有其他所有的问题都来自于没有恰当地分离关注点。如果您允许您的数据和代码混合,那么它们可能仍然可以工作,但是越混乱,就越难以解释。 |
![]() |
5
5
我会说最大的缺点是其他工具很难操纵这些数据。如果您将数据直接存储在Lua中,那么您需要编写一个Lua解析器,以便在每个环境都有XML解析器和生成器的情况下自动操作这些数据。这不仅仅是其他语言的工具的问题;如果您想编写一个用于编辑配置的图形用户界面,您是否有能够以不影响在版本控制系统中合并的方式分析、修改和写出配置数据的工具?对于有很多人同时编辑配置的大型项目来说,这一点很重要。 也就是说,同样的想法导致了 JSON ,它是用作数据格式的javascript的子集。但是目前有很多支持JSON的工具,可能不太多支持Lua的语法。 当您的代码是您的配置时,偶尔会出现另一个问题,那就是人们开始编写代码来生成配置,或者向配置文件添加抽象。然后,任何想要定制你的程序的用户都会变得困惑,不得不学习如何编程和整个编程语言,而不是相对简单的配置语言。 |
![]() |
6
3
如果Lua脚本是用户可访问的,那么必须强制执行用于数据规范的Lua子集,否则您所拥有的不仅仅是数据语言,而是安全漏洞。实现这样一个子集的问题并不简单。 你知道JSON吗?这可能更像是你想要的。 这里有两个实现: http://json.luaforge.net/ 这里 http://www.chipmunkav.com/downloads/Json.lua 如果JSON不够强大,另一个选项是Yaml,它是JSON的超集,不过我不能告诉您Lua中是否有合适的JSON实现。 |
![]() |
7
3
记住,LuaVM和语言非常灵活。您可以使用函数环境来实现您想要的任何形式的安全,然后使用策略来避免运行“恶意”代码。简单地从你的环境中消除一切 加载字符串() 你的数据和你的“数据”能做的唯一危险的事情就是运行一个循环并烧掉CPU。 另一件要记住的事情是,您总是可以将Lua表转换为XML,反之亦然,尽管元素和属性映射到Lua表上会导致表中出现一些奇怪的模式。 |
![]() |
8
2
我已经完成了一些使用Lua作为数据存储/配置语言的项目。 决定使用它的关键因素是“我们是否已经在那个项目上使用了Lua?” 另一件事是它可以移植到任何可以编译Lua解释器的地方。在所有平台上都是一样的-没有特殊的XML库 JSON是一个很好的选择。 目前我使用XML的唯一方法是为序列化程序使用带注释的代码gen,例如.NET XML或JAXB)。 |
![]() |
9
1
我通常远离XML,主要是因为它冗长。大多数时候,我使用CSV或SQLite进行数据存储。我使用脚本语言(如Lua、Python或Scheme)为用户提供扩展软件的接口。 |
|
John Whitham · 如何修复“尝试调用字符串值”错误 1 年前 |
![]() |
oreto · Roblox Lua脚本,如何使帧从左到右减小其大小? 2 年前 |
![]() |
Jexter Labo · 如何在Lua中从循环表中删除键值 2 年前 |
![]() |
Zack Lee · 在Lua中查找未使用的符号 7 年前 |
|
User101 · Roblox Studio-GUI的按键切换 7 年前 |
![]() |
Doudou · 当我的noob被杀死时,我的GUI如何显示? 7 年前 |
![]() |
eonmax · Lua在后台执行python脚本 7 年前 |