【问题标题】:How does ruby Marshal.load work in the context of object restoration?ruby Marshal.load 在对象恢复的上下文中是如何工作的?
【发布时间】:2014-11-25 19:22:36
【问题描述】:

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

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

例如,假设我有一个班级

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

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

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

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

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

【问题讨论】:

    标签: ruby serialization


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 2015-11-21
      • 1970-01-01
      相关资源
      最近更新 更多