Anchors for custom classes? #63

twelvechairs opened this Issue May 3, 2012 · 2 comments


None yet

1 participant


I cannot find a way to ensure that my custom classes will anchor properly (not duplicate when the same object exists in two locations) when converted to yaml through encode_with (or quick_emit, or others). Code below:

class NewClass
  attr_accessor :text
  def encode_with(coder){"text"=>self.text}
end; o.text="hi"

original = [o,o,o]

yaml = Psych.dump original
puts yaml 

This results in 3 individual versions of the same object (no anchor or referencing). Using Syck it defaults to one. I can't find a way to make this reference/anchor rather than duplicate. If there is any simple way of doing so I can't find it on the internet anywhere....


As a further issue along the same lines, loading anchored objects does not seem to work properly either. An example is shown in the following code:

class ANewClass
    attr_accessor :info

a=%q{- &123 !ruby/object:ANewClass
  info: haha
- *123
- *123}

YAML.add_domain_type( "ruby/object", "ANewClass" ) { |type, val|

puts loaded.inspect

The expected result would be an array containing 3 versions of the same object. Instead loaded[0] is unique whilst loaded[1] and loaded[2] are the same.


Hi. Nobody has responded to this yet, but I still live in hope. Anyway - I understand now the issue with my second post (recreating the object isn't necessary) and can get around this (conceptually odd as it seems), but I'm still curious as to the first. I have got around this with a temporary hook to register for anchors all objects created via encode_with (see code below), but I am curious as to why this isn't done by default? Has it been overlooked or is this a deliberate design decision (different to Syck)? Many thanks in advance for any response.

module Psych
  module Visitors
    class YAMLTree
      alias dump_coder_old dump_coder
      def dump_coder o
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment