RUBY中使用YAML - oyaji's Blog
RUBY中使用YAML
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文档不支持层次)。
从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'] }
经测试to_yaml和Marshal的dump相比,后者的性能要显著的优于前者的。
当然yaml更适合人来理解对象的内部结构的,使用场合不同
进一步学习: