2010-09-16 8 views
5

Ich versuche, die Standard-Deserialisierung des integrierten Timestamp-Format zu ändern, um Rubys Zeit zu beeinflussen.Ruby YAML :: load

ich dies tun (erfolgreich) mit 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 

Aber wenn ich das gleiche mit der Zeit versuchen, funktioniert es nicht:

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' 

Jede Hilfe würde geschätzt. Vielen Dank!

+0

Ich bin mir nicht sicher, ob es im Zusammenhang, aber YAML versagt Zeitobjekte Roundtrip nach http://redmine.ruby-lang.org/issues/show/4005 –

+0

Was ist der Zweck der allerersten Zeile? YAML :: add_domain_type ('yaml.org, 2002', 'map') {| t, v | nil} 'weil, wenn Sie das entfernen, der Hash auch nicht funktioniert. – stephenr

+0

Referenz für [YAML :: add_domain_type] (http://yaml4r.sourceforge.net/doc/class/yaml_add_domain_type_method.htm). –

Antwort

2

Wenn Sie Psych (das ist YAML in Ruby 1.9.3p194) verwenden, müssen Sie eine encode_with/1 Methode für die Klasse Time definieren.

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

Wenn die encode_with/1 Methode für das Objekt definiert ist, dann ruft Psych diese Methode in einer Instanz der Klasse Psych::Coder verläuft; Andernfalls ruft es die Methode visit_#{o.class} in der Klasse YAMLTree auf, die im Fall von visit_Time keine Tag-Informationen serialisiert.

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