ruby Marshal.load如何在对象恢复的环境中工作?

时间:2014-10-01 02:17:22

标签: ruby serialization

Ruby中的序列化可以通过内置的Marshal模块完成。 它提供了转储对象并加载它的方法。

我正在编写一些序列化并想知道如何加载对象并恢复其所有属性,而不实际调用构造函数?

例如,假设我有一个班级

class Test
  def initialize(id)
    @id = id
  end
end

假设我将其序列化为(假设一个非常简化的方案,可能一般不起作用)

{
    "Test": {
        "id": 3
    }
}

当我想要加载它时,我想我只是实例化一个新的Test对象并设置其属性。但是,调用new方法会抛出异常,因为我还没有传入ID。实际上,我还没有达到我读取ID的程度,一般来说,构造函数可以接受任意数量的参数,而且我不想为每个参数编写自定义逻辑。每个班级。

当您通过Marshal.load加载对象时,它只是以某种方式工作。它是如何工作的?

1 个答案:

答案 0 :(得分:1)

有关默认Class::new的说明,请参阅this answer。您可以在不添加对initialize的调用的情况下模仿此行为。相反,您将通过类似instance_variable_set的类似手动设置类的状态。请注意,这只是您自己如何实现这一点的建议。实际的Marshal.load可能用c写成,但它会做类似的事情。