RUBY中使用YAML - oyaji's Blog

RUBY中使用YAML

oyaji posted @ 2010年12月25日 19:41 in ruby with tags ruby YAML , 8394 阅读
 
1. YAML (Ain't Markup Language)
YAML是一种直观的能够被电脑识别的的数据数据序列化格式,他并且容易被人类阅读,容易和脚本语言交互的。换种说法,YAML是一种很简单的类似于XML的数据描述语言,语法比XML简单很多。
 
YAML相比XML的优点:
    YAML的可读性好。
    YAML和脚本语言的交互性好。
    YAML使用宿主语言的数据类型。
    YAML有一个一致的信息模型。
    YAML易于实现。
上面5条也就是XML不足的地方。同时,YAML也有XML的下列优点:
    YAML可以基于流来处理;
    YAML表达能力强,扩展性好。
总之,YAML试图用一种比XML更敏捷的方式,来完成XML所完成的任务。
 
YAML的写法:写YAML要比XML快得多(无需关闭标签或引号),并且比'.ini'文档功能更强(ini文档不支持层次)。
 
2. 在Ruby中使用YAML
从Ruby1.8开始YAML变成了标准库。简单的 require 'yaml',require 'yaml/store' 来引入后就可以使用了。
 
ruby中的绝大多数对象可以直接转化成YAML格式的字符串
require 'yaml' # 必须
obj.to_yaml    # 转化成YAML格式
 
反过来 使用YAML::load可以将to_yaml转化后的字符串复原为ruby对象
obj = ...
decoded_obj = YAML::load(obj.to_yaml)
 
类似用法的有:
obj = ... # 略

bin = Marshal.dump(obj)        # 将ruby对象转化成binary格式
loaded_obj = Marshal.load(bin) # 将binary格式的对象还原

require 'yaml'
yml = obj.to_yaml              # 将ruby对象转化成YAML格式
loaded_obj = YAML::load(yml)   # 将YAML格式的对象还原
 
需要注意的是,Marshal不能转化的输入输出对象和proc对象,也同样不能用YAML格式来转化
 
Pstore是在Marshal中使用的对象数据库
因为YAML可以替换Marshal来使用,所以YAML中通过YAML::Store来实现PStore的功能
比如现有代码中使用了PStore库的地发,首先引入 require ‘yaml/store'后,把PStore替换成YAML::Store即可
 
require 'yaml/store'
db = YAML::Store.new('yaml_db')
db.transaction{
  db['data'] = obj
  val1 = db['val1']
}
 
3. 性能
经测试to_yaml和Marshal的dump相比,后者的性能要显著的优于前者的。
当然yaml更适合人来理解对象的内部结构的,使用场合不同
 
进一步学习:

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter
Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee