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"
tag:ruby.yaml.org,2002:Element
質問 1:代わりに が得られなかったのはなぜ--- !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.8.7 ではなく 1.9+ で機能するのはなぜですか?
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 と同様) :上記の yamltag:ruby.yaml.org,2002:Element
にタグ ( )がないのはなぜですかserialize
YAML.load(e)
=> ## Suprisingly, print is not executed
質問 5 (質問 #2 と同様): Ruby 1.9+ でsyckおよびpyschパーサーself.yaml_new
が実行されないのはなぜですか?
誰でもこれらの質問を解決するのを手伝ってもらえますか?