ruby中使用ruby自身的Marshal类进行对象的序列化和反序列化操作:
class A
def put_str
puts "test text"
end
end
a_s = Marshal.dump(A.new) #实例化一个A对象,使用Marshal的dump方法进行序列化,序列化后的值如下:
"\x04\bo:\x06A\x00"
Marshal.load(a_s).put_str #反序列化a_s,并调用它的put_str方法,输出“test text”
Marshal支持定义自己的序列化和反序列化方法:
使用Marshal.dump保存对象时, 若该对象中已经定义了`_dump
'方法的话, 就直接使用该方法的返回值. `_dump
'方法接受limit对递归操作的限制, 将对象变为字符串并返回结果.
若某类的实例中包含`_dump
'方法的话, 则该类中必需包含一个名为`_load
'的类方法, 它负责读回数据. `_load
'在收到一个保存着对象的字符串之后, 必须将它还原为对象.
通常情况下, 实例变量的信息都被保存在marshal data中, 所以不必定义 _dump (但是,若定义了_dump的话, 实例变量的信息就不会被保存下来了). 若您想进行更加灵活的控制 ,或者扩展库中定义的类的实例需要保存除实例变量之外的更多信息时, 可以使用_dump/_load. (例如Time类就定义了_dump/_load)
class Foo
def initialize(obj)
p "initialize() called"
@foo = obj
end
def _dump(limit)
Marshal.dump(@foo, limit)
end
def self._load(obj)
Foo.new(Marshal.load(obj))
end
end
p Marshal.load(Marshal.dump(Foo.new(['foo', 'bar'])))
=> "initialize() called"
"initialize() called"
#<Foo:0x4019eb88 @foo=["foo", "bar"]>