ruby对象序列化和反序列化

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"]>

转载于:https://my.oschina.net/BpBhDzhTIE7Q/blog/203299

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值