2013-10-06 59 views
2

我使用serialize :my_array, Arrayserialize :my_hash, Hash很方便地將設置和數組存儲在數據庫中。我可以在ActiveRecord中序列化哪些對象?

我可以用這種方式使用哪些其他物體?我知道我可以使用StructOpenStruct作爲例子,但是如何知道一個對象是否可以通過ActiveRecord這種方式進行序列化?例如,我怎麼知道我是否可以用這種方式使用Set類(本應該叫UniqArray,請注意)?

回答

2

此代碼確定Rails的serialize方法用於序列化編碼器:

if [:load, :dump].all? { |x| class_name.respond_to?(x) } 
    class_name 
else 
    Coders::YAMLColumn.new(class_name) 
end 

這意味着在短:一個Object可以被序列化,如果Object本身所具有的方法loaddump。或者如果YAML可以loaddumpObject。用這種方法檢查:

object == YAML.load(YAML.dump(object)) # with require 'yaml' in irb 
2

AR中的序列化使用Psych將轉儲實例轉換爲yaml字符串。

Psych反過來知道如何序列化從Object繼承的所有對象(它幾乎是Ruby中的所有對象)。

在一般情況下,Psych採用對象的所有實例變量並將它們轉儲爲yaml字段。

也有特殊的情況下傾倒幾類,如ArrayClassDateDateTimeExceptionFalseClassFloatHashIntegerModuleNilClassRangeRationalRegexpStringStructSymbolTime,TrueClass,和其他一些很少使用。

作爲示例,如果我們有class UniqArray < Set和實例UniqArray.new([1,2,3]) - 傾倒字符串將是"--- !ruby/object:UniqArray\nhash:\n 1: true\n 2: true\n 3: true\n"(其中hash是實現集存儲一個實例變量名)

相關問題