2010-07-26 79 views
2

我有一個數據庫列是一個序列化HashActiveRecord的序列化問題

class Foo < ActiveRecord::Base 
    serialize :bar 
end 

當我保存的酒吧,是幾級深的內部哈希,更深層次似乎不正確反序列化時,我需要他們。一級深度的對象得到反序列化就好了。但是,2級或更多級別的對象仍然是YAML類。

我嘗試使用YAML :: load()手動反序列化,但得到一個錯誤,說參數不是IO的一個實例。

有誰知道爲什麼完整的Ruby對象不反序列化?

編輯:經過進一步調查後,問題似乎源於我從序列化的YAML調用虛擬屬性的事實。

class Foo < ActiveRecord::Base 
    serialize :bar 
end 

class Bar < ActiveRecord::Base 
    attr_accessor :enabled 
end 

@bars = @foo.bar[:bars] 
@bars.each do |bar| 
    puts bar.enabled 
end 

產量:

NoMethodError: undefined method `enabled' for #<YAML::Object:0xb6f11844> 
    from (irb):12 
    from (irb):11:in `each' 
    from (irb):11 
    from :0 

這是否意味着反序列化是不是「真正的」,即YAML對象的行爲類似原來的對象,但它不是該對象的實際實例?

回答

4

當序列化用戶定義的對象而不是「普通的舊Ruby」對象時,需要注意兩點。

  • 您需要在對象可以正確地反序列化之前加載用戶定義的類,或者實例將是通用的YAML :: Object類型。反序列化不會自動加載類。
  • 某些對象可能無法正確序列化,沒有一些自定義,但通常情況並非如此。

一般來說,序列化ActiveRecord :: Base對象的實例是一個壞主意,因爲它們的行李數量非常多,除了屬性之外,還需要對其進行編碼。最好是構建一個直接來自Object的類,這是默認行爲,或者來自某種簡單的基類。

+1

您可以使用'serialize:attribute,Classname'來確保類在反序列化之前被加載。 – 2012-03-08 23:21:51

+0

我有一個問題,我有一個自定義類的數組 - 解決方案是'需要'custom_class''前'serialize:array_of_classes_field,Array' – you786 2014-01-22 05:07:13