Marshalling delegates

N

Nathan Weston

I can't seem to marshal a delegate. The code below:

class Foo < SimpleDelegate
end

Marshal.dump(Foo.new(nil))

Gives me an error:
TypeError: singleton can't be dumped

The weird thing is that defining _dump or marshal_dump in Foo doesn't
make this problem go away.
Even stranger is that this error suddenly started showing up in code
that used to work... I'm not sure what may haev changed in the interim
(haven't touched the code in a few weeks), except I may have apt-get
updated my ruby installation.

Is there any way I can dump a delegate?

Nathan
 
Y

Yukihiro Matsumoto

Hi,

In message "Marshalling delegates"

|I can't seem to marshal a delegate. The code below:
|
|class Foo < SimpleDelegate
|end
|
|Marshal.dump(Foo.new(nil))
|
|Gives me an error:
|TypeError: singleton can't be dumped
|
|The weird thing is that defining _dump or marshal_dump in Foo doesn't
|make this problem go away.

It's a bug in 1.8.0. Soon to be fixed. Thank you.

matz.
 
N

Nathan Weston

After digging around a bit in the delegate source, I fixed the problem
like this:

class MarshalDelegator < SimpleDelegator
alias :make_methods :initialize

def marshal_dump
return @obj
end

def marshal_load(obj)
initialize(obj)
end
end

To marshal, the delegator just dumps the object it is delegating for.
To unmarshal, it loads that object, and sets up the wrapper methods by
calling initialize.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,774
Messages
2,569,598
Members
45,152
Latest member
LorettaGur
Top