Ruby中的序列化可以通过内置的Marshal
模块完成。
它提供了转储对象并加载它的方法。
我正在编写一些序列化并想知道如何加载对象并恢复其所有属性,而不实际调用构造函数?
例如,假设我有一个班级
class Test
def initialize(id)
@id = id
end
end
假设我将其序列化为(假设一个非常简化的方案,可能一般不起作用)
{
"Test": {
"id": 3
}
}
当我想要加载它时,我想我只是实例化一个新的Test
对象并设置其属性。但是,调用new
方法会抛出异常,因为我还没有传入ID。实际上,我还没有达到我读取ID的程度,一般来说,构造函数可以接受任意数量的参数,而且我不想为每个参数编写自定义逻辑。每个班级。
当您通过Marshal.load
加载对象时,它只是以某种方式工作。它是如何工作的?
答案 0 :(得分:1)
有关默认Class::new
的说明,请参阅this answer。您可以在不添加对initialize
的调用的情况下模仿此行为。相反,您将通过类似instance_variable_set
的类似手动设置类的状态。请注意,这只是您自己如何实现这一点的建议。实际的Marshal.load
可能用c写成,但它会做类似的事情。