【发布时间】: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+ 中为 syck 和 pysch 解析器执行?
谁能帮我解决这些问题?
【问题讨论】:
-
如果我猜测处决,出于安全原因,它可能不会发生。 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