Snažím sa zmeniť predvolenú deserializáciu vstavaného formátu časovej značky, aby som ovplyvnil Rubyho čas.
Robím to (úspešne) s Hash:
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
Ale keď to isté skúšam s Časom, nefunguje to:
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"
Akákoľvek pomoc by bola ocenená. Vďaka!
odpovede:
2 pre odpoveď č. 1Ak používate Psych (čo je YAML v ruby 1.9.3p194), potom musíte definovať encode_with/1
metóda na časovej triede.
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 -0400n...n"
YAML.load(yaml) # -> "HELLO!!"
Ak encode_with/1
metóda je definovaná na objekte, potom Psych volá túto metódu, ktorá prechádza v inštancii Psych::Coder
trieda; inak to nazýva visit_#{o.class}
metóda v YAMLTree
triedy, ktorá v prípade visit_Time
nesignalizuje žiadne informácie o značkách.
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