IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

序列化格式YAML初探

标点符 2012-03-04 17:32:39 累计浏览 3,178 次
本机暂存

YAML,是一个可读性高,用来表达资料序列的编程语言。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式。目YAML是”YAML Ain’t a Markup Language”(YAML不是一种置标语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:”Yet Another Markup Language”(仍是一种置标语言),但为了强调这种语言以数据做为中心,而不是以置标语言为重点,而用返璞词重新命名。

    YAML的功能

YAML的语法和其他高阶语言类似,并且可以简单表达清单、杂凑表,标量等资料形态。它使用空白符号缩排和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种设定档、倾印除错内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。尽管它比较适合用来表达阶层式(hierarchical model)的数据结构,不过也有精致的语法可以表示关联性(relational model)的资料。由于YAML使用空白字符和分行来分隔资料,使的他特别适合用grep/Python/Perl/Ruby操作。其让人最容易上手的特色是巧妙避开各种封闭符号,如:引号、各种括号等,这些符号在巢状结构时会变得复杂而难以辨认。

为什么不使用XML?

  • YAML的可读性好。
  • YAML和脚本语言的交互性好。
  • YAML使用实现语言的数据类型。
  • YAML有一个一致的信息模型。
  • YAML易于实现。
  • 上面5条也就是XML不足的地方。同时,YAML也有XML的下列优点:

  • YAML可以基于流来处理;
  • YAML表达能力强,扩展性好。
  • 总之,YAML试图用一种比XML更敏捷的方式,来完成XML所完成的任务。

    为什么不使用JSON

    JSON的语法是YAML1.2版的子集,,同时非常接近YAML1.0与1.1版的子集,因此大部分的JSON文件都可以被YAML的剖析器剖析。这是因为JSON的语法结构和YAML的内置格式相同。虽然大范围的分层也可以使用类似JSON的内置格式,不过这并YAML标准并不建议这样使用,除非这样编写能让文件可读性增加。YAML的许多扩展在JSON是找不到的,如:进阶资料形态、关系锚点、字串不需要双引号、映射资料形态会储存键值的顺序。

    YAML的语法要求

        在yaml.org(英文)可以找到轻巧而好用的小抄(亦是用YAML表示)及格式说明。下面的内容,是关于基本元件的摘要。

  • YAML使用可打印的Unicode字符,可使用UTF-8或UTF-16。
  • 使用空白字符为文件缩排来表示结构;不过不能使用跳格字符(TAB)。
  • 注解由井字号( # )开始,可以出现在一行中的任何位置,而且范围只有一行(也就是一般所谓的单行注解)
  • 每个清单成员以单行表示,并用短杠+空白( -   )起始。或使用方括号( [ ] ),并用逗号+空白( ,   )分开成员。
  • 每个杂凑表的成员用冒号+空白( :   )分开键值和内容。或使用大括号( {   } ),并用逗号+空白( ,   )分开。
  • 杂凑表的键值可以用问号 ( ? )起始,用来明确的表示多个词汇组成的键值。
  • 字串平常并不使用引号,但必要的时候可以用双引号 ( )或单引号 ( )框住。
  • 使用双引号表示字串时,可用倒斜线( \\ )开始的跳脱字符(这跟C语言类似)表示特殊字符。
  • 区块的字串用缩排和修饰词(非必要)来和其他资料分隔,有新行保留(preserve)(使用符号 | )或新行折叠(flod)(使用符号 > )两种方式。
  • 在单一档案中,可用连续三个连字号(——)区分多个档案。
  • 另外,还有选择性的连续三个点号( )用来表示档案结尾。
  • 重复的内容可使从参考标记星号 ( * )复制到锚点标记( & )。
  • 指定格式可以使用两个惊叹号 ( !! ),后面接上名称。
  • 档案中的单一文件可以使用指导指令,使用方法是百分比符号( % )。有两个指导指令在YAML1.1版中被定义:
  •  %YAML 指导指令,用来识别文件的YAML版本。
  •  %TAG 指导指令,被用在URI的字首标记。这个方法在标记节点的型态时相当有用。
  •     YAML再使用逗号及冒号时,后面都必须接一个空白字符,所以可以再字串或数值中自由加入分隔符号(例如:5,280或http://www.wikipedia.org)而不需要使用引号。

        另外还有两个特殊符号在YAML中被保留,有可能在未来的版本被使用-( @ )和( ` )。

    YAML的适用范围

    由于实现简单,解析成本很低,YAML特别适合在脚本语言中使用。列一下现有的语言实现:Ruby,Java,Perl,Python,PHP,OCaml,JavaScript。除了Java,其他都是脚本语言.

    YAML比较适合做序列化。因为它是宿主语言数据类型直转的。

    YAML做配置文件也不错。比如Ruby on Rails的配置就选用的YAML。对ROR而言,这很自然,也很省事.

    由于兼容性问题,不同语言间的数据流转建议现在不要用YAML.

    YAML存在的意义

    无论多么完美的事物,都需要有对立面,有说“NO”的声音。XML也不例外。当然,站在主流的对立面,需要勇气和智慧。

    YAML和XML不同,没有自己的数据类型的定义,而是使用实现语言的数据类型。这一点,有可能是出奇制胜的地方,也可能是一个败笔。如果兼容性保证的不好的话,YAML数据在不同语言间流转会有问题。如果兼容性好的话,YAML就会成为不同语言间数据流通的桥梁。建议yaml.org设立兼容认证机制,每个语言的实现必须通过认证。

    假如兼容性没问题的话,YAML就太完美了。轻巧,敏捷,高效,简便,通用。这才是理想中的数据模型。当然就现在而言,这还只是个理想。

    常用YAML函式库

  • PHP
  • Spyc 纯PHP的实现。
  • PHP-Syck(与SYCK函式库绑定)
  • sfYamlsymfony项目重写的Spyc, 可独立使用, 可以产生和剖析YAML文件。
  • Python
  • PyYaml 纯Python,或可选用LibYAML的函式库。
  • PySyck 与SYCK绑定。
  •     参考链接:http://zh.wikipedia.org/wiki/YAML

    同分类推荐文章

    1. 从零重建 macOS 开发机:可复现的环境初始化流程 (2026-06-14 20:36:00)
    2. 百度物理网络监控工具开源第二弹:毫秒级监控工具 baize,让你的网络问题无处遁形 (2026-06-11 08:10:28)
    3. How to Set Up Homebrew Tap for Private CLI Tools: A Complete Guide (2026-05-27 02:13:03)

    查看更多 DevOps 文章 →

    建议继续学习

    1. Git log diff config高级进阶 (累计阅读 24,843)
    2. nginx的配置文件 (累计阅读 9,881)
    3. Zookeeper研究和应用 (累计阅读 9,481)
    4. 玩转Protocol Buffers (累计阅读 6,615)
    5. 如何让ssh登录更加安全 (累计阅读 5,711)
    6. 解开 phprpc 序列化性能高于 hessian 的秘密 (累计阅读 5,313)
    7. 共享会话的ssh连接配置 (累计阅读 4,817)
    8. 对protostuff和java序列化的小测试 (累计阅读 4,602)
    9. 调整 QQ for Linux 的小技巧 (累计阅读 4,479)
    10. Proto Buffers in Lua (累计阅读 4,402)