簡體   English   中英

Ruby YAML :: load

[英]Ruby YAML::load

我正在嘗試修改內置時間戳格式的默認反序列化,以影響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

但是當我嘗試使用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'

任何幫助,將不勝感激。 謝謝!

如果您使用Psych(在ruby 1.9.3p194中為YAML),則需要在Time類上定義encode_with/1方法。

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!!"

如果在對象上定義了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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM