+ 我要发布
我发布的 我的标签 发现
浏览器扩展
斑点象@Edge

YAML与其他数据序列化格式JSON、XML、SDL的比较

虽然YAML是参考JSON,XML和SDL等语言,不过跟这些语言比起来,YAML仍有自己的特色。 JSON JSON的语法是YAML1.2版的子集,,同时非常接近 YAML1.0与1.1版的子集,因此大部分的JSON文件都可以被YAML的分析器剖析。这是因为JSON的语法结构和YAML的内置格式相同。虽然大范围的分层也可以使用类似JSON的内置格式,不过YAML标准并不建议这样使用,除非这样编写能让文件可读性增加。YAML的许多扩展在JSON是找不到的,如:高级数据形态、关系锚点、字符串不需要双引号、映射数据形态会存储键值的顺序。 XML和SDL XML和SDL标签概念,在YAML中是找不到的。对于数据结构序列(尽管这是有争议的),标签属性的特色就是可以将数据及复杂数据附加信息分离,并将各种原生数据结构(如:散列表、数组)用同一种语言表示。YAML则以数据的可扩展性作为替代。(包括为了模拟对象的类别类型)在YAML本身的规范中,并没有类似XML的语言定义文件刚要(language-defined document schema descriptors)──例如验证自己本身的结构是否正确的文件。不过,YAML纲要描述语言(YAML schema descriptor language)是存在的。另外还有YAXML──用XML描述YAML的结构──可以让XML Schema与XSLT转换程序应用在YAML之上。况且,在一般使用的情况下,YAML丰富的定义类型之语法已经提供了足够的方式,来辨认YAML文件是否正确。 缩进划界 由于YAML的运作主要依赖大纲式的缩进来决定结构,这有效解决了界定符冲突(Delimiter collision)的问题。YAML的数据形态不依赖引号之特点,使的YAML文件可以利用区块,轻易的插入各种其他类型文件,如:XML、SDL、JSON,甚至插入另一篇YAML。 ``` --- example: > HTML goes into YAML without modification message: | <blockquote style="font: italic 12pt Times"> <p>"Three is always greater than two, even for large values of two"</p> <p>--Author Unknown</p> </blockquote> ``` 相反的,要将YAML置入XML或SDL中时,需要将所有空白字符和位势符号(potential sigils,如:<,>和&)转换成实体语法;要将YAML置入JSON中,需要用引号框住,并转换内部的所有引号。 非层次结构式的数据模型 跟SDL、JSON等,每个子结点只能有单一一个父节点的层次结构式模型不同,YAML提供了一个简单的关系体制,可以从树状结构的其他地方,重复相同的数据,而不必显示那些冗余的结构。这点和XML中的IDRef类似YAML分析器在将YAML转换成对象时,会自动将那些参考资料的结构展开,所以程序在使用时并不会查觉到哪些数据是解码自这种结构。XML则不会将这种结构展开。这种表示法可以增加程序的可读性,并且,在那种‘大部分参数维持和上次相同,只有少数改变’的配置文件及通信协议中,可以减少数据输入错误。一个例子是:‘送货地点’和‘购买地点’在发票的纪录中几乎都是相同的数据。 实际的考量 YAML是“行导向的”,因此,就算想由现有程序的混乱输出,转换成YAML格式,并保留大部分的原始文件之外观,也非常简单。因为他不需要平衡封闭的标签、括弧及引号,可以从很简单的利用程序,从报表产生YAML。同样,空格分隔可让使用行导向的命令如:grep、Awk、perl、ruby,和Python,来应急性的过滤YAML文件时更加方便。 特别是与标记语言不同的,连续的YAML区块导向往往是格式良好的YAML文件本身。这使得很容易撰写那种“在开始提取的具体记录之前,不需要'读取全部文件内容'”的解析器(通常需要平衡起始和关闭标签、查找引号和转义字符)。当处理一个单一静态的,整个存在存储器中的数据结构将很大,或为提取一个项目来重建的整个结构,代价相当昂贵的记录档,这种特性是相当方便的。 值得讨论的是,尽管它的缩进方式似乎复杂化了深度很大的嵌套层次, YAML将缩进视为一个单一的空白,这可能会获取比其他标记语言更好的压缩比。此外,极深的缩进可以完全避免的是: (1)使用“内置格式”(即简称类JSON格式)而无缩进;或 (2)使用关系锚点展开层次结构以形成一个摊平的格式,使得YAML解析器能透明地重组成完整的数据结构。 安全性 YAML是纯粹用来表达数据的语言,所以内部不会存代码注射的可执行命令。这代表分析器会相当(至少)安全的解析文件,而不用担心潜在与执行命令相关的安全漏洞。举例来说,JSON是JavaScript的子集,因此可能有人想使用JavaScript本身的分析器直接eval,不过这样一来就造成许多代码注射的漏洞。虽然在所有数据序列语言中,安全解析本质上是可能的,但可执行性却正是这样一个恶名昭彰的缺陷;而YAML缺乏相关的命令语言,可能是一个相对安全的利益。 数据处理和呈现 XML和YAML规范提供非常不同的逻辑模型来进行数据结点的展现、处理及存储。
我的笔记