Object Marshaling
Todd Calvert
todd.calvert at raytheon.com
Thu Feb 21 18:01:59 UTC 2008
My question is about marshaling non-native Ruby objects in and out of
Memcached. I would like to be able to take a user defined object (ex:
foo) and put that into Memcached and then have another process retrieve
that 'foo' object from Memcached without having the foo object
definition. (the .rb file)
Is there a way to reconstitute the marshaled object when you have
retrieved it from memcached if you don't have the object definition?(the
.rb file)
I'm new to Memcached and Ruby, so any guidance would be appreciated.
Here is the error I get when running the example code below. The foo
object is inserted into memcached, but when trying to retrieve the foo
object from memcached the foo object is undefined. I can get around
this error if I require the foo object definition in get_foo.rb, but if
I have distributed applications trying to retrieve this object I don't
see it as optimal to make each client have the foo object definition.
todd at heynow:~/code/ruby/memcache$ ruby get_foo.rb
/usr/lib/ruby/gems/1.8/gems/memcache-client-1.5.0/lib/memcache.rb:214:in
`load': undefined class/module Foo (ArgumentError)
from
/usr/lib/ruby/gems/1.8/gems/memcache-client-1.5.0/lib/memcache.rb:214:in
`get'
from get_foo.rb:18
Example code:
--------------------------- foo.rb
-----------------------------------------------------
#!/usr/bin/env ruby
class Foo
attr_accessor :bar
def initialize()
@bar = 'bar'
end
end
--------------------------- set_foo.rb
----------------------------------------------
!#/usr/bin/env ruby
require 'rubygems'
require 'memcache'
require 'foo'
memcache_options = {
:compression => true,
:debug => true,
:namespace=> 'todd_space',
:readonly => false,
:urlencode => false
}
Cache = MemCache.new memcache_options
Cache.servers = '147.18.118.74:11211'
foo_object = Foo.new
foo_object.bar = "foobar"
Cache.set('1', foo_object,0,false)
-----------------------------------------------------------------------------------------------
--------------------------------- get_foo.rb
------------------------------------------
!#/usr/bin/env ruby
require 'rubygems'
require 'memcache'
memcache_options = {
:compression => true,
:debug => true,
:namespace=> 'todd_space',
:readonly => false,
:urlencode => false
}
Cache = MemCache.new memcache_options
Cache.servers = '147.18.118.74:11211'
obj = Cache.get('1')
puts "Foo Object: bar value = #{obj.bar}"
--------------------------------------------------------------------------------------------
Thanks,
-Todd
More information about the memcached
mailing list