[ruby-list:41802] Re: Hashを継承したクラスでYAML.dump

From: "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
Date: 2006-01-26 08:42:46 UTC
List: ruby-list #41802
こんにちは、山本です。

>こんにちは。sakazukiです。
>
>YAMLライブラリのバグレポートです
>Hashを継承したクラスで定義した属性がYAML.dump/loadで復元出来ません。

私の環境では、1.8.2 と 1.8.3 で違いが見られました。ただ、属性を復元して
いるのではなく、YAML.load で initialize が呼ばれるかどうかの違いでした。

///////////////////////////////////////////
// コード

require 'yaml'

class B < Hash
  def initialize(*v)
    @order = $order
    puts "initialize"
    super
  end
  attr_accessor :order
end

$order = []
p s = YAML.dump(B.new)
$order = nil
o = YAML.load(s)
p o.order

///////////////////////////////////////////
// 1.8.2

initialize
"--- !ruby/hash:B {}"
initialize
nil

//////////////////////////////////////////
// 1.8.3

initialize
"!map:B {}\n\n"
nil


dumpの結果には、属性情報が含まれておらず、1.8.2 では
initialize が呼ばれるので偶々 @order = [] が実行される
ということのようです。

# Marshal では復元されるので、やはりバグなのかもしれませんが

それと、調べていてこんなバグを見つけました。

E:\ruby-cvs>ruby -ryaml -e "YAML.load('!map:B {}')"
e:/ruby/lib/ruby/1.8/yaml.rb:133: [BUG] Segmentation fault
ruby 1.8.4 (2005-12-24) [i386-bccwin32]


Abnormal program termination

これは良くないですね。


In This Thread

Prev Next