2016-07-27 65 views
2

有什么办法来坚持红宝石绑定?我无法使用marshal.dump。 Doc说坚持红宝石绑定

如果要转储的对象包括绑定,过程或方法对象,类IO的实例或单例对象,则会引发TypeError。

我们需要在多个请求中使用相同的绑定。我如何序列化/ deserilaze红宝石绑定?

+4

一个简单的例子,所以那些给出答案可以展示他们的代码? –

+0

_requests_是否表示HTTP请求? – Aetherus

+0

*为什么*你想要?这听起来完全疯狂,甚至尝试。如果你想保存数据和绑定,你将不会将它序列化。序列化有一个隐含的承诺,即您可以在将来使用不同的进程或不同的机器对其进行反序列化,并将数据返回。那时绑定将完全消失。 – tadman

回答

0

序列化绑定的想法在很多方面是不连贯的,因为绑定与运行时堆栈密切相关;当你反序列化绑定时,它是否应该重新创建堆栈?

这就是说,如果你只是想获得了绑定的,你可以用像这样做:

class Binding 
    def values_for_serialization 
    data = { 
     locals: {}, 
     self: eval('self',self) 
    } 
    eval("local_variables",self).each do |lvar| 
     data[:locals][lvar] = local_variable_get(lvar) 
    end 
    data 
    end 
end 

然后,您可以序列化使用Marshal#dumpto_yaml返回的结构,管他呢。

反序列将工作是这样的:

class Binding 
    def self.from_values(values) 
    bind = values[:self].instance_exec { binding } 
    values[:locals].each_pair do |lvar,value| 
     bind.local_variable_set(lvar,value) 
    end 
    bind 
    end 
end 

不过需要注意的是,虽然这会给你一个结合有那一个适当的自我对象,适当的局部变量,它不会真的被相同绑定。例如,如果您尝试使用它来序列化顶级脚本绑定,您可以;然后在另一个脚本中,您可以对其进行反序列化。但是当你这样做时,局部变量而不是在该脚本顶级绑定中可用,它们只会在你创建的绑定对象中可用。