2010-09-16 10 views
5

Estoy tratando de modificar la deserialización predeterminada del formato de marca de tiempo incorporado, para afectar el tiempo de Ruby.Ruby YAML :: cargar

hago esto (con éxito) con 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 

Pero cuando trato de la misma con el tiempo, no funciona:

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' 

Cualquier ayuda sería muy apreciada. ¡Gracias!

+0

No estoy seguro de si está relacionado, pero YAML está fallando a ida y vuelta objetos de tiempo de acuerdo a http://redmine.ruby-lang.org/issues/show/4005 –

+0

¿Cuál es el propósito de la primera línea, 'YAML :: add_domain_type ('yaml.org, 2002', 'map') {| t, v | nil} 'porque si eliminas eso, el hash tampoco funciona. – stephenr

+0

Referencia para [YAML :: add_domain_type] (http://yaml4r.sourceforge.net/doc/class/yaml_add_domain_type_method.htm). –

Respuesta

2

Si está utilizando Psych (que es YAML en ruby ​​1.9.3p194), entonces necesita definir un método encode_with/1 en la clase 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 se define el método de encode_with/1 en el objeto a continuación Psych pide que el método que pasa en una instancia de la clase Psych::Coder; de lo contrario, llama al método visit_#{o.class} en la clase YAMLTree, que en el caso de visit_Time no serializa ninguna información de etiqueta.

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