2014-10-01 28 views
0

Ruby中的序列化可以通過內置的Marshal模塊完成。 它提供轉儲對象並加載它的方法。紅寶石Marshal.load如何在對象恢復的情況下工作?

我正在寫一些序列化,並想知道如何加載一個對象並恢復其所有屬性,而無需實際調用構造函數?

例如,假設我有一個類

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

想我是序列化到(假設這可能不會在一般的工作非常簡化方案)

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

當我想加載它,我想我只是實例化一個新的Test對象並設置它的屬性。但是,調用new方法會拋出異常,因爲我還沒有傳入ID。的確,我還沒有開始閱讀ID,一般來說,構造函數可以接受任意數量的參數,我不想爲每個類都編寫自定義邏輯。

當您通過Marshal.load加載對象時,它只是以某種方式工作。它是如何工作的?

回答

1

請參閱this answer瞭解默認Class::new所做的操作。您可以在不添加對initialize的調用的情況下模仿此行爲。相反,您可以通過類似instance_variable_set的手動設置類的狀態。請注意,這只是您如何自己實現這一點的建議。實際的Marshal.load很可能用c寫成,但它會做類似的事情。