2010-09-16 2 views
5

J'essaie de modifier la désérialisation par défaut du format d'horodatage intégré, pour affecter le temps de Ruby.Ruby YAML :: load

Je le fais (avec succès) avec 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 

Mais quand j'essaie même avec le temps, il ne fonctionne pas:

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' 

Toute aide serait appréciée. Merci!

+0

Je ne sais pas si elle est liée, mais YAML ne parvient pas à aller-retour des objets temps selon http://redmine.ruby-lang.org/issues/show/4005 –

+0

quel est le but de la toute première ligne, 'YAML :: add_domain_type ('yaml.org, 2002', 'map') {| t, v | nil} 'parce que si vous supprimez cela, le hachage ne fonctionne pas non plus. – stephenr

+0

Référence pour [YAML :: add_domain_type] (http://yaml4r.sourceforge.net/doc/class/yaml_add_domain_type_method.htm). –

Répondre

2

Si vous utilisez Psych (qui est YAML dans ruby ​​1.9.3p194), vous devez définir une méthode encode_with/1 sur la classe 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!!" 

Si la méthode encode_with/1 est définie sur l'objet puis Psych appelle cette méthode qui passe dans une instance de la classe Psych::Coder; sinon, il appelle la méthode visit_#{o.class} dans la classe YAMLTree qui, dans le cas de visit_Time, ne sérialise aucune information de balise.

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