UnMarshal without source file

I’m looking for a STANDARD methods to unmarshal a class istance without
have source file.

Thanx

Manny Calavera wrote:

I’m looking for a STANDARD methods to unmarshal a class istance without
have source file.

How would you want it to work? For example, if it contains an object of
class Foo::Bar, and such class does not exist at runtime, would you want
it to create a fresh Foo::Bar class? Such class would have no methods of
course, apart from those inherited from Object.

A quick experiment suggests that Object.const_missing is not invoked by
Marshal.load, so perhaps parsing the Marshal format yourself is the best
bet.

Il Sun, 25 Oct 2009 16:28:50 +0100, Brian C. [email protected]
vergò:

Manny Calavera wrote:

I’m looking for a STANDARD methods to unmarshal a class istance without
have source file.

How would you want it to work? For example, if it contains an object of
class Foo::Bar, and such class does not exist at runtime, would you want
it to create a fresh Foo::Bar class? Such class would have no methods of
course, apart from those inherited from Object.

My idea was:

class Klass
def method
“It work!”
end
end

class MyMarshal
def MyMarshal.dump ist
s=“class\ndef method\n"It work!"\nend\nend\n”
s<< “§”
s<< Marshal.dump(ist)
s
end

def MYMarshal.load s
array=s.split/§/
eval array[0]
Marshal.load array[1]
end
end

But something more STANDARD

Manny Calavera wrote:

My idea was:

But something more STANDARD

Well, a Class itself is not marshalable, nor is the singleton class of
an object.

If you want to save and restore the definitions of classes
automatically, you’ll have to do something very funky using ParseTree or
the like.

Otherwise, I’d say your approach might be reasonable, but is rather
dangerous and duplicates definitions of methods. How about this?

module MyMarshal
def dump(obj)
Marshal.dump [$LOADED_FEATURES, Marshal.dump(obj)]
end
module_function :dump

def load(str)
  requires, dump = Marshal.load(str)
  requires.each do |r|
    require r.sub(/\.rb\z/,'')
  end
  Marshal.load(dump)
end
module_function :load

end

This depends on your class definitions being available in source files
which are loaded using ‘require’. It has obvious downsides, but
something like this might work for you.

It really depends on what your application is trying to do. Why are you
loading objects which are not defined in the context of the loading
application? How would you know what methods to call on those objects?

Regards,

Brian.