3

我正在尝试在 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执行syckpysch解析器?

谁能帮我解决这些问题?

4

1 回答 1

0
  • 问题1:这个我没有任何答案
  • 问题 2:因为 Psych 正确处理它,但您应该使用yaml_tag而不是yaml_tag
  • 问题3:使用def yaml_initialize(tag, val)它会起作用
  • 问题 4:因为它又是 Syck,它的行为就像在 Ruby 1.8 中一样
  • 问题5:同Q4
于 2014-02-24T11:45:06.397 回答