# YAML problem with serializing of nested object structures

**URL:** <https://www.ruby-forum.com/t/yaml-problem-with-serializing-of-nested-object-structures/80429>\
**Category:** Ruby\
**Created:** [December 26, 2006, 3:11pm UTC](https://www.ruby-forum.com/t/yaml-problem-with-serializing-of-nested-object-structures/80429 "2006-12-26T15:11:30Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Kjetil\_Orbekk](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/e9bcb4/32.png) [@Kjetil\_Orbekk](https://www.ruby-forum.com/u/Kjetil_Orbekk)\
**Post date:** [December 26, 2006, 3:11pm UTC](https://www.ruby-forum.com/t/yaml-problem-with-serializing-of-nested-object-structures/80429/1 "2006-12-26T15:11:30Z")

</div>

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}”

---

<div class="post-metadata">

**Author:** ![Kjetil\_Orbekk](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/e9bcb4/32.png) [@Kjetil\_Orbekk](https://www.ruby-forum.com/u/Kjetil_Orbekk)\
**Post date:** [December 26, 2006, 3:27pm UTC](https://www.ruby-forum.com/t/yaml-problem-with-serializing-of-nested-object-structures/80429/2 "2006-12-26T15:27:31Z")

</div>

Hi –

On Tue, 26 Dec 2006, Kjetil Orbekk wrote:

> class Test  
> ary = [a, b]
> 
> 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

---

<div class="post-metadata">

**Author:** ![Kjetil\_Orbekk](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/e9bcb4/32.png) [@Kjetil\_Orbekk](https://www.ruby-forum.com/u/Kjetil_Orbekk)\
**Post date:** [December 26, 2006, 5:35pm UTC](https://www.ruby-forum.com/t/yaml-problem-with-serializing-of-nested-object-structures/80429/3 "2006-12-26T17:35:49Z")

</div>

On 26.12.2006 15:11, Kjetil Orbekk wrote:

> ruby --version is “1.8.4 (2005-12-24) [i486-linux]”. My operating  
> system is Debian GNU/Linux 4.0.

First of all, there does not seem to be an issue with general recursive  
structures:

$ irb -r yaml  
irb(main):001:0\> a=[1]  
=\> [1]  
irb(main):002:0\> b=[2,a]  
=\> [2, [1]]  
irb(main):003:0\> a \<\< b  
=\> [1, [2, […]]]  
irb(main):004:0\> b  
=\> [2, [1, […]]]  
irb(main):005:0\> str = a.to\_yaml  
=\> “— &id001 \n- 1\n- - 2\n - \*id001\n”  
irb(main):007:0\> c = YAML.load str  
=\> [1, [2, […]]]  
irb(main):008:0\> c[1]  
=\> [2, [1, […]]]

I changed your code a bit (attached) but with no new results. It seems,  
you actually hit a bug in YAML. Marshal does not seem to have this  
problem (see last output). So, if the output needs not be readable then  
this is definitively an alternative - and it’s also faster IIRC.

Kind regards

```
robert
```
