有什么方法可以持久化 ruby 绑定(bind)吗?我无法使用 marshal.dump。医生说
if the objects to be dumped include bindings, procedure or method objects, instances of class IO, or singleton objects, a TypeError will be raised.
我们需要在多个请求中使用相同的绑定(bind)。我如何序列化/反序列化 ruby 绑定(bind)?
最佳答案
序列化绑定(bind)的想法在很多方面都是不连贯的,因为绑定(bind)与运行时堆栈密切相关;当您反序列化绑定(bind)时,它是否也应该重新创建堆栈?
就是说,如果您只想从绑定(bind)中获取值,您可以使用如下方法:
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#dump
、to_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
但请注意,虽然这会给您一个 绑定(bind),它具有适当的自身对象和适当的局部变量,但它并不是真正的相同 绑定(bind)。例如,如果您尝试使用它来序列化顶级脚本绑定(bind),您可以;然后在另一个脚本中你可以反序列化它。但是当您这样做时,局部变量将不在该脚本的顶级绑定(bind)中可用,它们仅在您创建的绑定(bind)对象中可用。
关于ruby - 坚持 ruby 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38617396/