【问题标题】:Serialization/Deserialization ruby object in YAMLYAML 中的序列化/反序列化 ruby​​ 对象
【发布时间】:2013-08-21 17:30:46
【问题描述】:

我正在尝试了解在 1.8.7 和 1.9+ 下使用 YAML 对 ruby​​ 对象进行序列化/反序列化,并对此有一些疑问(我找不到太多关于此的文档)

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

Ruby 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 没有在YAML.load 上被调用? 1.9+以下不支持吗?

   YAML::ENGINE.yamler = 'syck'
   => syck
   u =  Element.new.to_yaml
   => "--- !ruby/object:Element {}\n\n" 

问题4(类似于问题#1):为什么上面的serialize yaml 中缺少标签(tag:ruby.yaml.org,2002:Element

   YAML.load(e)
   =>  ## Suprisingly, print is not executed 

问题 5(类似于问题 #2):为什么 self.yaml_new 没有在 ruby​​ 1.9+ 中为 syckpysch 解析器执行?

谁能帮我解决这些问题?

【问题讨论】:

  • 如果我猜测处决,出于安全原因,它可能不会发生。 YAML 曾经是 Ruby 1.8.7 内置的,但现在它是不同解析器/引擎下的一个单独模块。 rdocs 上似乎没有 Ruby 2.0 的文档,但我认为 yaml_new 只在 Rails 中调用,而不在 Ruby 中调用
  • 我建议修复格式。所有粗体字都像是在大喊大叫。一点点就能走很长的路;读起来很痛苦,让我什至不想尝试。另外,在这样的情况下,你最多得到两个,也许最多三个问题,所以减少你想问的问题!
  • ruby 1.8.7 是longer supported
  • 您有 5 个问题,轻读似乎是:“为什么在不受支持的版本中不受支持的库中存在错误?”我敢肯定这不是你要问的。如果您将问题简化为“给定 X,我如何让 Y 工作?”你更有可能得到答案。
  • 我和@zhon 在一起,你应该问真正的问题,除非这些问题是出于好奇。无论如何,旧版本的 Ruby YAML 解析器是一团糟,并且有不止一个不一致,所以我对这些奇怪的行为并不感到惊讶,只需查看 psych issues 以了解它们的奇怪之处

标签: ruby yaml ruby-1.9 ruby-1.8 ruby-1.8.7


【解决方案1】:
  • 问题 1:我对此没有任何答案
  • 问题 2:因为 Psych 正确处理了它,但您应该使用 yaml_tag 而不是 yaml_tag
  • 问题 3:使用def yaml_initialize(tag, val) 就可以了
  • 问题 4:因为它又是 Syck,所以它的行为就像 Ruby 1.8 中的一样
  • 问题5:同Q4

【讨论】:

    猜你喜欢
    • 2011-10-16
    • 2020-11-06
    • 2012-09-09
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2013-11-01
    • 2011-06-19
    相关资源
    最近更新 更多