我正在尝试在 1.8.7 和 1.9+ 下使用 YAML 了解 ruby 对象的序列化/反序列化,并对此有一些疑问(我找不到太多关于此的文档)
红宝石 1.8.7
class Element
yaml_as "tag:ruby.yaml.org,2002:Element"
def self.yaml_new(klass, tag, val)
puts "print you are in yaml"
end
end
YAML.parser
=> syck ## parser is set as syck all good
e = Element.new.to_yaml
=> "--- !ruby/Element {}\n\n"
问题1:现在为什么我没有得到tag:ruby.yaml.org,2002:Element
而不是--- !ruby/Element {}\n\n
?
YAML.load(e)
=> print your are in "yaml" ##print statement execute all good
## Not sure who to change the parser in 1.8 to `pysch` so skipping this part
红宝石 1.9+
YAML::ENGINE.yamler
=> pysch
e = Element.new.to_yaml
=> "--- !<tag:ruby.yaml.org,2002:Element> {}\n" ## I see the tag in 1.9+ fine
问题 2:为什么它在 1.9+ 而不是 1.8.7 中工作?
YAML.load(e)
=> ## The print is not getting printed
问题3:为什么print you are in yaml
不打印?换句话说,为什么self.yaml_new
不被调用 on YAML.load
?1.9+ 下不支持吗?
YAML::ENGINE.yamler = 'syck'
=> syck
u = Element.new.to_yaml
=> "--- !ruby/object:Element {}\n\n"
问题 4(类似于问题 #1):为什么上面的 yamltag:ruby.yaml.org,2002:Element
中缺少 tag()serialize
YAML.load(e)
=> ## Suprisingly, print is not executed
问题 5(类似于问题 #2):为什么在 ruby 1.9+ 中没有self.yaml_new
执行syck和pysch解析器?
谁能帮我解决这些问题?