From: dblack@... Date: 2006-12-26T23:26:42+09:00 Subject: Re: YAML problem with serializing of nested object structures Hi -- On Tue, 26 Dec 2006, Kjetil Orbekk wrote: > Hi! > > I'm making a graph tool, and i have some problem with the > serialization of my graphs. The problem comes when i try to load a > graph i earlier serialized with YAML. In the objects i serialize, I > have two instance variables (arrays, as below) that contain some other > objects of similar type (also serialized). I managed to reproduce the > problem with a simpler object structure below. To me, this seems very > wierd, especially since it saves some data and breaks it when > loading. Could it be a bug, or am I doing something wrong here? > > ruby --version is "1.8.4 (2005-12-24) [i486-linux]". My operating > system is Debian GNU/Linux 4.0. > > Ruby code: > ---------- > > require "yaml" > > # Test class with two instance variables to hold arrays with similar > # objects > class Test > attr_accessor :c1, :c2 > def initialize(c1=[], c2=[]) @c1, @c2 = c1, c2 end > end > > a = Test.new > b = Test.new([a],[Test.new]) > a.c1 << b > a.c2 << b > > # The problem comes when saving the whole thing as an array > ary = [a, b] > > yaml1 = YAML.dump(ary) > > # +ary_from_yaml[0]+ looses its c2 even though it's clearly in the YAML output > ary_from_yaml = YAML.load(yaml1) > > yaml2 = YAML.dump(ary_from_yaml) > > print "YAML 1\n" + yaml1 + "\n\n" > print "YAML 2\n" + yaml2 + "\n\n" > > print "YAML 1 length: #{yaml1.length} \tYAML 2 length: #{yaml2.length}" I'm not totally sure but maybe the recursion is causing the problem. You've got b containing a, and a's attributes containing b. I'm not sure how YAML handles that kind of recursion. David -- Q. What is THE Ruby book for Rails developers? A. RUBY FOR RAILS by David A. Black (http://www.manning.com/black) (See what readers are saying! http://www.rubypal.com/r4rrevs.pdf) Q. Where can I get Ruby/Rails on-site training, consulting, coaching? A. Ruby Power and Light, LLC (http://www.rubypal.com)