Joh*_*ohn 5 ruby yaml ruby-on-rails
我正在尝试修改内置时间戳格式的默认反序列化,以影响Ruby的时间.
我用哈希(成功)做到了这一点:
YAML::add_domain_type('yaml.org,2002', 'map') { |t, v| nil }
YAML::add_domain_type('ruby.yaml.org,2002', 'hash') { |t, v| nil }
hash = { :hello => :world }
puts YAML::load(hash.to_yaml) # nil
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用Time时,它不起作用:
YAML::add_domain_type('yaml.org,2002', 'timestamp') { |t, v| nil }
YAML::add_domain_type('ruby.yaml.org,2002', 'time') { |t, v| nil }
puts YAML::load(Time.now.to_yaml).class # 'Time'
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激.谢谢!
如果您使用 Psych(这是 ruby 1.9.3p194 中的 YAML),那么您需要encode_with/1在 Time 类上定义一个方法。
require 'yaml'
class Time
def encode_with(coder)
coder.tag = '!ruby/time'
coder.scalar = to_s
end
end
YAML::add_domain_type('ruby.yaml.org,2002', 'ruby/time') { |t, v| "HELLO!!" }
yaml = YAML.dump(Time.new) # -> "--- !ruby/time 2012-10-25 14:18:59 -0400\n...\n"
YAML.load(yaml) # -> "HELLO!!"
Run Code Online (Sandbox Code Playgroud)
如果该encode_with/1方法是在对象上定义的,则 Psych 会调用该方法并传入该类的实例Psych::Coder;否则,它调用类visit_#{o.class}中的方法YAMLTree,在这种情况下visit_Time不会序列化任何标签信息。
https://github.com/tenderlove/psych/blob/master/lib/psych/visitors/yaml_tree.rb#l100-105
https://github.com/tenderlove/psych/blob/master/lib/psych/visitors/yaml_tree.rb#l172-175
| 归档时间: |
|
| 查看次数: |
2793 次 |
| 最近记录: |